1 | #include <stm32f30x.h>
|
2 | #include <stm32f30x_gpio.h>
|
3 | #include <stm32f30x_rcc.h>
|
4 | #include <stm32f30x_usart.h>
|
5 | #include <stm32f30x_misc.h>
|
6 |
|
7 |
|
8 |
|
9 | //global variables
|
10 | volatile unsigned char uart_receive; // for receiving one char
|
11 |
|
12 |
|
13 | // prototypes
|
14 | unsigned char USART_ReadByteSync(USART_TypeDef *USARTx);
|
15 | void USART2_IRQHandler(void);
|
16 | void InitializeUSART();
|
17 | int _write (char *pBuffer, int size);
|
18 |
|
19 |
|
20 | void InitializeUSART()
|
21 | {
|
22 | RCC_USARTCLKConfig(RCC_USART2CLK_SYSCLK);
|
23 | RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
|
24 | RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); //Enable peripheral clock for USART2
|
25 |
|
26 |
|
27 | GPIO_InitTypeDef gpioConfig;
|
28 |
|
29 | //PB3 = USART2.TX => Alternative Function Output
|
30 | GPIO_PinAFConfig(GPIOB, GPIO_PinSource3, GPIO_AF_7); //Alternativ Funktionalität USART2 für Pin 3 an GPIOB aktivieren
|
31 | gpioConfig.GPIO_Mode = GPIO_Mode_AF; // Alternate function mode page: 237
|
32 | gpioConfig.GPIO_OType = GPIO_OType_PP; // Output Push-Pull page: 237
|
33 | gpioConfig.GPIO_Speed = GPIO_Speed_10MHz; // Medium speed page: 238
|
34 | gpioConfig.GPIO_PuPd = GPIO_PuPd_NOPULL; // No pull-up, pull down page: 239
|
35 | gpioConfig.GPIO_Pin = GPIO_Pin_3;
|
36 | GPIO_Init(GPIOB, &gpioConfig); // pin initialization
|
37 |
|
38 |
|
39 | //PB4 = USART2.RX => Alternative Function Output
|
40 | GPIO_PinAFConfig(GPIOB, GPIO_PinSource4, GPIO_AF_7);
|
41 | gpioConfig.GPIO_Mode = GPIO_Mode_AF;
|
42 | gpioConfig.GPIO_OType = GPIO_OType_PP;
|
43 | gpioConfig.GPIO_Speed = GPIO_Speed_10MHz;
|
44 | gpioConfig.GPIO_PuPd = GPIO_PuPd_NOPULL;
|
45 | gpioConfig.GPIO_Pin = GPIO_Pin_4;
|
46 | GPIO_Init(GPIOB, &gpioConfig);
|
47 |
|
48 |
|
49 | USART_InitTypeDef usartConfig;
|
50 |
|
51 | usartConfig.USART_BaudRate = 9600;
|
52 | usartConfig.USART_WordLength = USART_WordLength_8b; //USART2->CR1 |= 0x0000;
|
53 | usartConfig.USART_StopBits = USART_StopBits_1;
|
54 | usartConfig.USART_Parity = USART_Parity_No;
|
55 | usartConfig.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
|
56 | usartConfig.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
|
57 | USART_Init(USART2, &usartConfig);
|
58 |
|
59 |
|
60 |
|
61 | // ######## configure NVIC for Interrupt when data received: ###########
|
62 | NVIC_InitTypeDef NVIC_InitStructure;
|
63 |
|
64 | NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; // select NVIC channel
|
65 | NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // value between 0 and 15; A lower priority value indicates a higher priority
|
66 | NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
|
67 | NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
|
68 | NVIC_Init(&NVIC_InitStructure);
|
69 | USART_ClearITPendingBit(USART2, USART_IT_RXNE); // Clear interrupt flag
|
70 | USART_ClearITPendingBit(USART2, USART_IT_TXE);
|
71 |
|
72 | USART_ITConfig(USART2, USART_IT_TXE, DISABLE); // disable Transmit Data Register empty interrupt
|
73 | USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); // Enable the USART RX Interrupt
|
74 | //NVIC_EnableIRQ(USART2_IRQn); // Enable USART2 global interrupt
|
75 |
|
76 |
|
77 | USART_Cmd(USART2, ENABLE); // UART2 enable //USARTx->CR1 |= USART_CR1_UE; //Enable the selected USART by setting the UE bit in the CR1 register */ page: 937
|
78 | }
|
79 |
|
80 |
|
81 |
|
82 | void USART2_IRQHandler(void)
|
83 | {
|
84 | //Interrupt handler implementation
|
85 |
|
86 | if (USART_GetITStatus(USART2, USART_IT_RXNE)) //checking if interrupt
|
87 | uart_receive = USART_ReadByteSync(USART2);
|
88 |
|
89 | USART_ClearITPendingBit(USART2, USART_IT_RXNE); //Clear interrupt flag
|
90 | }
|
91 |
|
92 |
|
93 |
|
94 | unsigned char USART_ReadByteSync(USART_TypeDef *USARTx)
|
95 | {
|
96 | while (USART_GetFlagStatus(USARTx, USART_FLAG_RXNE) == RESET) // RXNE is set when content of the shift register is transferred to the RDR
|
97 | {
|
98 |
|
99 | }
|
100 |
|
101 | return (unsigned char)USART_ReceiveData(USARTx);
|
102 | }
|
103 |
|
104 |
|
105 |
|
106 | int main ()
|
107 | {
|
108 |
|
109 | SystemInit();
|
110 | InitializeUSART();
|
111 |
|
112 | for (;;)
|
113 | {
|
114 | while(1)
|
115 | {
|
116 | //for sending 1 char
|
117 | while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET); // we can only write in the TDR register when TXE=1 (because when TXE ==1 -> data is transferred to the shift register) page: 898 - 899
|
118 | {
|
119 | USART_SendData(USART2, 0x55); //USARTx->TDR = (Data & (uint16_t)0x01FF); //Transmit data by writing it in the TDR
|
120 | }
|
121 |
|
122 |
|
123 | }
|
124 | }
|
125 | }
|