ich bin beim USART von STM32F103ZG programmieren, und kriege einfach den USART nicht richtig zum Laufen ich sage in die main dass der µController soll mir folgendes schicken KHM_USART_SendData (USART1,'S'); KHM_USART_SendData (USART1,'T'); KHM_USART_SendData (USART1,'A'); KHM_USART_SendData (USART1,'R'); KHM_USART_SendData (USART1,'T'); die funktion KHM_USART_SendData sieht foldegendes aus void KHM_USART_SendData(USART_TypeDef* USARTx, uint16_t Data) { /* Check the parameters */ assert_param(IS_USART_ALL_PERIPH(USARTx)); assert_param(IS_USART_DATA(Data)); while(USART_FLAG_TC==0) // 0: Transmission is not complete { } USARTx->DR = (Data & (uint16_t)0x01FF); /* Transmit Data */ } das Problem ist, er schickt mir nur das Letzte'T' über Hyperterminal.er kann nicht zwei SendData hintereinnader tun... hat jemand Ahnung woran kann das liegen Danke für eure Hilfe
Die gedachte "Warteschleife"
1 | while(USART_FLAG_TC==0) // 0: Transmission is not complete |
2 | {
|
3 | }
|
dürfte rauslaufen auf sowas wie
1 | while(1==0) |
2 | {
|
3 | }
|
weil USART_FLAG_TC nicht der Status selbst ist, sondern die Maske (oder Nummer) des Bits im Register.
in der Firmware Library von ST, In dem Paket sind auch einige Beispiele. ich habe folgende Funktion probiert, aber leider hat auch nicht geklappt.. void USART_SendData(USART_TypeDef* USARTx, uint16_t Data) { /* Check the parameters */ assert_param(IS_USART_ALL_PERIPH(USARTx)); assert_param(IS_USART_DATA(Data)); /* Transmit Data */ USARTx->DR = (Data & (uint16_t)0x01FF); }
Die Lib ist nicht so mein Ding wird aber bestimmt irgendwo auch eine Möglichkeit zum Warten oder eine Abfragemöglichkeit dieses Flags besitzet. Jedenfalls musst du die Warteschleife so bauen, dass du auf das entsprechende Bit im Register wartest, und nicht darauf dass die Zahl 1 irgendwann 0 wird.
1 | #include "stm32f10x_conf.h" |
2 | |
3 | // ***********************************************************************
|
4 | // USART Initialisierung
|
5 | // ***********************************************************************
|
6 | void init_usart (void) { |
7 | USART_InitTypeDef USART_InitStructure; |
8 | |
9 | USART_InitStructure.USART_BaudRate = 9600; // 9600 Baud |
10 | USART_InitStructure.USART_WordLength = USART_WordLength_8b; // 8 Datenbit |
11 | USART_InitStructure.USART_StopBits = USART_StopBits_2; // 2 Stopp-Bits |
12 | USART_InitStructure.USART_Parity = USART_Parity_No; // keine Parität |
13 | USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; // kein RTS/CTS |
14 | USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; // USART senden und empfangen |
15 | |
16 | USART_Init(USART2, &USART_InitStructure); // USART initialisieren |
17 | USART_Cmd(USART2, ENABLE); // USART freigeben |
18 | // USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); // USART Empfangs-Interrupt freigeben, siehe stm32f10x_it.c
|
19 | }
|
20 | |
21 | // ***********************************************************************
|
22 | // USART - Byte senden
|
23 | // Übergabe: Sende-Byte
|
24 | // ***********************************************************************
|
25 | void sendbyte_usart (uint8_t byte) { |
26 | while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET); // warten, falls Buffer voll |
27 | USART_SendData(USART2, byte); // Byte senden |
28 | }
|
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.