Guten Tag, Ich würde gerne über den UART eines STM32F4 was verschicken. Hardware ist (vorerst) ein STM32F4-Discovery, mit dem STM32F407VG. Das letzte mal als ich mit dem Zeug gearbeitet hab, war das noch die Standard-Peripheral-Lib, jetzt wollte ich mal das Cube-Zeugs ausprobieren. Also, gesagt, getan, ein neues CubeMX-Projekt (CubeMX Version 4.13.1) für Atollic TrueStudio (V 5.4.0). Den UART habe ich, zum debuggen, erstmal mit dem Klickibunti-Interface von CubeMX konfiguriert. Der entstandene Source-Code ist angehangen. Baudrate sollte übrigens 9600 sein. Raus kommt aber nichts, was wie UART aussieht. Nur die Signale vom Bild, und die alle 40ms (wie zu erwarten; aber halt nichts UART-ähnliches). Hat jemand die Lust/Zeit/Erfahrung, mich beim Debugging zu ünterstützen? Wem springt mein Fehler sofort ins Auge? PS: Noch was zur Config: Habe den HSE auf die 8 MHz gestellt, die PLL auf M=8; N=336 und P=2. Sollten also 168MHz Sysclk rauskommen. PPS: TxD ist an PA9. Hab ich mit einem LA verbunden. Auch wenn das im Quelltext nicht ersichtbar ist, ist der in einer von CubeMX-generierten LowLevel-Methode (im UART_Init) auf AlternativeFunction geschalten.
:
Bearbeitet durch User
Vincent H. schrieb: > __UART1_CLK_ENABLE(); > > ? sollte CubeMX für mich machen: Die HAL_UART_Init:
1 | HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart) |
2 | {
|
3 | /* Check the UART handle allocation */
|
4 | if(huart == NULL) |
5 | {
|
6 | return HAL_ERROR; |
7 | }
|
8 | |
9 | /* Check the parameters */
|
10 | if(huart->Init.HwFlowCtl != UART_HWCONTROL_NONE) |
11 | {
|
12 | /* The hardware flow control is available only for USART1, USART2, USART3 and USART6 */
|
13 | assert_param(IS_UART_HWFLOW_INSTANCE(huart->Instance)); |
14 | assert_param(IS_UART_HARDWARE_FLOW_CONTROL(huart->Init.HwFlowCtl)); |
15 | }
|
16 | else
|
17 | {
|
18 | assert_param(IS_UART_INSTANCE(huart->Instance)); |
19 | }
|
20 | assert_param(IS_UART_WORD_LENGTH(huart->Init.WordLength)); |
21 | assert_param(IS_UART_OVERSAMPLING(huart->Init.OverSampling)); |
22 | |
23 | if(huart->gState == HAL_UART_STATE_RESET) |
24 | {
|
25 | /* Allocate lock resource and initialize it */
|
26 | huart->Lock = HAL_UNLOCKED; |
27 | /* Init the low level hardware */
|
28 | HAL_UART_MspInit(huart); |
29 | }
|
30 | |
31 | huart->gState = HAL_UART_STATE_BUSY; |
32 | |
33 | /* Disable the peripheral */
|
34 | __HAL_UART_DISABLE(huart); |
35 | |
36 | /* Set the UART Communication parameters */
|
37 | UART_SetConfig(huart); |
38 | |
39 | /* In asynchronous mode, the following bits must be kept cleared:
|
40 | - LINEN and CLKEN bits in the USART_CR2 register,
|
41 | - SCEN, HDSEL and IREN bits in the USART_CR3 register.*/
|
42 | huart->Instance->CR2 &= ~(USART_CR2_LINEN | USART_CR2_CLKEN); |
43 | huart->Instance->CR3 &= ~(USART_CR3_SCEN | USART_CR3_HDSEL | USART_CR3_IREN); |
44 | |
45 | /* Enable the peripheral */
|
46 | __HAL_UART_ENABLE(huart); |
47 | |
48 | /* Initialize the UART state */
|
49 | huart->ErrorCode = HAL_UART_ERROR_NONE; |
50 | huart->gState= HAL_UART_STATE_READY; |
51 | huart->RxState= HAL_UART_STATE_READY; |
52 | |
53 | return HAL_OK; |
54 | }
|
und die msp_init, die von obiger aufgerufen wird:
1 | void HAL_UART_MspInit(UART_HandleTypeDef* huart) |
2 | {
|
3 | |
4 | GPIO_InitTypeDef GPIO_InitStruct; |
5 | if(huart->Instance==USART1) |
6 | {
|
7 | /* USER CODE BEGIN USART1_MspInit 0 */
|
8 | |
9 | /* USER CODE END USART1_MspInit 0 */
|
10 | /* Peripheral clock enable */
|
11 | __USART1_CLK_ENABLE(); |
12 | |
13 | /**USART1 GPIO Configuration
|
14 | PA9 ------> USART1_TX
|
15 | PA10 ------> USART1_RX
|
16 | */
|
17 | GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10; |
18 | GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; |
19 | GPIO_InitStruct.Pull = GPIO_PULLUP; |
20 | GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; |
21 | GPIO_InitStruct.Alternate = GPIO_AF7_USART1; |
22 | HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); |
23 | |
24 | /* Peripheral interrupt init*/
|
25 | HAL_NVIC_SetPriority(USART1_IRQn, 0, 0); |
26 | HAL_NVIC_EnableIRQ(USART1_IRQn); |
27 | /* USER CODE BEGIN USART1_MspInit 1 */
|
28 | |
29 | /* USER CODE END USART1_MspInit 1 */
|
30 | }
|
31 | |
32 | }
|
Hab grad nochmal ins Datenblatt geschaut, der 407er hat im USART_CR1 Register eigene Bits für "Transmitter enable" und "Receiver enable". Hast du schon überprüft ob die gesetzt werden? So wie ich das seh setzt nämlich weder das Makro
1 | __HAL_UART_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1 |= USART_CR1_UE) |
Noch die USART_Transmit Funktion dieses Bit?
So schnell gehts, ich habe es (vermutlich) hinbekommen. Mindestens ein Problem habe ich entdeckt: Der TxD-Pin (PA9) ist am Discovery-Board auch für VBUS (von USB) genutzt. Da liegt wohl noch irgendwas auf der Leitung, was den stört. Ich habe den jetzt auf PB6-regemapped. Außerdem gibt es wohl noch irgendein Problem mit meiner Debug-Konfiguration im TrueSTUDIO, also musste ich die Software erstmal (manuell) über die ST-Link Utility flashen. Aber er macht das was er soll. Trotzdem danke an alle, die versucht haben, zu helfen. Schönen Freitag, Peter
:
Bearbeitet durch User
Peter K. schrieb: > Guten Tag, > > PS: Noch was zur Config: Habe den HSE auf die 8 MHz gestellt, die PLL > auf M=8; N=336 und P=2. Sollten also 168MHz Sysclk rauskommen. > PPS: TxD ist an PA9. Hab ich mit einem LA verbunden. Auch wenn das im > Quelltext nicht ersichtbar ist, ist der in einer von CubeMX-generierten > LowLevel-Methode (im UART_Init) auf AlternativeFunction geschalten. Zum eigentlichen Problem schreibe ich nichts (die Libraries sind einfach würg und ohne geht es meiner Meinung nach viel einfacher), aber die PLL-Faktoren solltest Du umstellen. Laut Datenblatt ist der Jitter bei M=4 deutlich kleiner. ("Caution: The software has to set these bits correctly to ensure that the VCO input frequency ranges from 1 to 2 MHz. It is recommended to select a frequency of 2 MHz to limit PLL jitter.")
Dr. MIPS schrieb: > Zum eigentlichen Problem schreibe ich nichts (die Libraries sind einfach > würg und ohne geht es meiner Meinung nach viel einfacher), aber die > PLL-Faktoren solltest Du umstellen. > Laut Datenblatt ist der Jitter bei M=4 deutlich kleiner. > ("Caution: The software has to set these bits correctly to ensure that > the VCO input frequency ranges from 1 to 2 MHz. It is recommended to > select a frequency of 2 MHz to limit PLL jitter.") Vielen Dank, ist notiert und wird realisiert! So gründlich habe ich mir das Datenblatt doch nicht durchgelesen :)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.