Hallo, ich verwende den Usart3 eines STM32f100RB, daten senden ist kein problem, aber das Empfangen. den Interupt hab ich wie folgt konfiguriert: // Enable the USART3 RX Interrupt NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); und die Interruptroutine sieht wie folgt aus: void USART3_IRQHandler(void) { byte bufferRx[5]; if(USART_GetITStatus(USART3, USART_IT_RXNE) == RESET) { USART_ITConfig(USART3, USART_IT_RXNE, DISABLE); /* Read one byte from the receive data register */ bufferRx[0] = USART_ReceiveData(USART3); USART_ITConfig(USART3, USART_IT_RXNE, ENABLE); } } Leider wird der Interrupt nicht ausgelöst. kann mir jemand helfen? danke
Und wie konfigurierst du die USART? Das verrätst du uns in deinem Code-Schnipsel leider nicht. Ansonsten ist das Disablen des RXNE IRQ auch völlig unnötig. Sieh dir doch einfach mal das Beispiel von ST an. Vergleiche das evtl. mit der Lib von Peter und dann kannst du das ganze noch mal versuchen.
Dieser code funktioniert bei mir - vielleicht hilft es dir weiter: ist allerdings für den Usart1
1 | #include "stm32f10x_gpio.h" |
2 | #include "stm32f10x_rcc.h" |
3 | #include "stm32f10x_usart.h" |
4 | #include "stm32f10x_tim.h" |
5 | #include "misc.h" |
6 | |
7 | GPIO_InitTypeDef GPIO_InitStructure; |
8 | TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; |
9 | USART_InitTypeDef USART_InitStructure; |
10 | |
11 | #define READ_BUFFER_SIZE 20
|
12 | |
13 | volatile char read_buffer[READ_BUFFER_SIZE]; |
14 | volatile char read_buffer_single = 0; |
15 | volatile char string_complete = 0; |
16 | volatile int uart_str_count = 0; |
17 | |
18 | void Delay(__IO uint32_t nCount) |
19 | {
|
20 | while(nCount--) |
21 | {
|
22 | }
|
23 | }
|
24 | |
25 | void nvic_initialisierung(uint16_t IRQ) |
26 | {
|
27 | NVIC_InitTypeDef NVIC_InitStructure; //create NVIC structure |
28 | NVIC_InitStructure.NVIC_IRQChannel = IRQ; |
29 | NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; |
30 | NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; |
31 | NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; |
32 | NVIC_Init(&NVIC_InitStructure); |
33 | }
|
34 | |
35 | void UARTSend(const unsigned char *pucBuffer) |
36 | {
|
37 | |
38 | while(*pucBuffer) |
39 | {
|
40 | USART_SendData(USART1, (uint16_t) *pucBuffer++); |
41 | /* Loop until the end of transmission */
|
42 | while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) |
43 | {
|
44 | }
|
45 | }
|
46 | }
|
47 | |
48 | void USART_Configuration(void) |
49 | {
|
50 | |
51 | // Enable USART1 and GPIOA clock */
|
52 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE); |
53 | |
54 | /* Configure USART1 Tx (PA.09) as alternate function push-pull */
|
55 | GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; |
56 | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; |
57 | GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; |
58 | GPIO_Init(GPIOA, &GPIO_InitStructure); |
59 | |
60 | /* Configure USART1 Rx (PA.10) as input floating */
|
61 | GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; |
62 | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; |
63 | GPIO_Init(GPIOA, &GPIO_InitStructure); |
64 | |
65 | /* USART1 configuration ------------------------------------------------------*/
|
66 | /* USART1 configured as follow:
|
67 | - BaudRate = 19200 baud
|
68 | - Word Length = 8 Bits
|
69 | - One Stop Bit
|
70 | - No parity
|
71 | - Hardware flow control disabled (RTS and CTS signals)
|
72 | - Receive and transmit enabled
|
73 | - USART Clock disabled
|
74 | - USART CPOL: Clock is active low
|
75 | - USART CPHA: Data is captured on the middle
|
76 | - USART LastBit: The clock pulse of the last data bit is not output to
|
77 | the SCLK pin
|
78 | */
|
79 | USART_InitStructure.USART_BaudRate = 19200; |
80 | USART_InitStructure.USART_WordLength = USART_WordLength_8b; |
81 | USART_InitStructure.USART_StopBits = USART_StopBits_1; |
82 | USART_InitStructure.USART_Parity = USART_Parity_No; |
83 | USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; |
84 | USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; |
85 | |
86 | USART_Init(USART1, &USART_InitStructure); |
87 | |
88 | /* Enable the USART1 Receive interrupt: this interrupt is generated when the
|
89 | USART1 receive data register is not empty */
|
90 | USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); |
91 | |
92 | /* Enable USART1 */
|
93 | USART_Cmd(USART1, ENABLE); |
94 | }
|
95 | |
96 | |
97 | void USART1_IRQHandler(void) |
98 | {
|
99 | if (USART_GetITStatus(USART1,USART_IT_RXNE) == SET) |
100 | {
|
101 | USART_ClearITPendingBit(USART1,USART_IT_RXNE); |
102 | |
103 | // Daten aus dem Puffer lesen
|
104 | read_buffer_single = (USART1->DR & (uint16_t)0x01FF); |
105 | |
106 | if ( string_complete==0 ) |
107 | {
|
108 | //Bedingungen für ein Ende des Strings
|
109 | if (read_buffer_single!='\n' && read_buffer_single!='\r' && uart_str_count<READ_BUFFER_SIZE-1) |
110 | {
|
111 | read_buffer[uart_str_count]=read_buffer_single; |
112 | uart_str_count++; |
113 | }
|
114 | else
|
115 | {
|
116 | read_buffer[uart_str_count]='\0'; |
117 | uart_str_count=0; |
118 | string_complete=1; |
119 | }
|
120 | }
|
121 | }
|
122 | }
|
123 | |
124 | |
125 | int main(void) |
126 | {
|
127 | |
128 | SystemInit(); |
129 | nvic_initialisierung(USART1_IRQn); |
130 | USART_Configuration(); |
131 | |
132 | while(1){ |
133 | if (string_complete) |
134 | {
|
135 | // Echo des gesendeten Strings erzeugen
|
136 | // Achtung der String muss mit '\n' oder '\r' abgeschlossen werden beim Sender
|
137 | UARTSend(read_buffer); |
138 | UARTSend("\n\r"); |
139 | string_complete = 0; |
140 | }
|
141 | }
|
142 | }
|
DANKE Jo discovery es hat geklappt, jetzt probier ich des ganze mal mit dem empfang über DMA. hast du da auch noch ein beispiel?
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.