1 | /*************************
|
2 | * stm32 uart main.c
|
3 | *************************/
|
4 |
|
5 | #include "stm32f10x.h"
|
6 | #include "print.h"
|
7 |
|
8 |
|
9 | /* User defined function prototypes */
|
10 | void GPIOB_Init(void);
|
11 | void USART1_Init(void);
|
12 | void led_toggle(void);
|
13 |
|
14 |
|
15 | int main(void)
|
16 | {
|
17 | /* Initialize GPIOA PIN8 */
|
18 | GPIOB_Init();
|
19 | /* Initialize USART1 */
|
20 | USART1_Init();
|
21 | printf_("Hello World");
|
22 | // USART_SendData(USART1, 'T');
|
23 |
|
24 | while(1)
|
25 | {
|
26 | //USART_SendData(USART1, 'T'); /* Do nothing, all happens in ISR */
|
27 | }
|
28 | }
|
29 |
|
30 | /***********************************************
|
31 | * Initialize GPIOA PIN8 as push-pull output
|
32 | ***********************************************/
|
33 | void GPIOB_Init(void)
|
34 | {
|
35 | /* Bit configuration structure for GPIOA PIN8 */
|
36 | GPIO_InitTypeDef gpiob_init_struct = { GPIO_Pin_2, GPIO_Speed_50MHz,
|
37 | GPIO_Mode_Out_PP };
|
38 |
|
39 | /* Enable PORT A clock */
|
40 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
|
41 | /* Initialize GPIOA: 50MHz, PIN8, Push-pull Output */
|
42 | GPIO_Init(GPIOB, &gpiob_init_struct);
|
43 |
|
44 | /* Turn off LED to start with */
|
45 | GPIO_SetBits(GPIOB, GPIO_Pin_2);
|
46 | }
|
47 |
|
48 | /*****************************************************
|
49 | * Initialize USART1: enable interrupt on reception
|
50 | * of a character
|
51 | *****************************************************/
|
52 | void USART1_Init(void)
|
53 | {
|
54 | /* USART configuration structure for USART1 */
|
55 | USART_InitTypeDef usart1_init_struct;
|
56 | /* Bit configuration structure for GPIOB PIN6 and PIN7 (alternative function) */
|
57 | GPIO_InitTypeDef gpiob_init_struct;
|
58 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOB, ENABLE);
|
59 | GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE);
|
60 |
|
61 | /* Enalbe clock for USART1, AFIO and GPIOA */
|
62 |
|
63 |
|
64 | /* GPIOB PIN6 alternative function Tx */
|
65 | gpiob_init_struct.GPIO_Pin = GPIO_Pin_6;
|
66 | gpiob_init_struct.GPIO_Speed = GPIO_Speed_50MHz;
|
67 | gpiob_init_struct.GPIO_Mode = GPIO_Mode_AF_PP;
|
68 | GPIO_Init(GPIOB, &gpiob_init_struct);
|
69 | /* GPIOB PIN7 alternative function Rx */
|
70 | gpiob_init_struct.GPIO_Pin = GPIO_Pin_7;
|
71 | gpiob_init_struct.GPIO_Speed = GPIO_Speed_50MHz;
|
72 | gpiob_init_struct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
|
73 | GPIO_Init(GPIOB, &gpiob_init_struct);
|
74 |
|
75 | /* Enable USART1 */
|
76 | USART_Cmd(USART1, ENABLE);
|
77 | /* Baud rate 9600, 8-bit data, One stop bit
|
78 | * No parity, Do both Rx and Tx, No HW flow control
|
79 | */
|
80 | usart1_init_struct.USART_BaudRate = 9600;
|
81 | usart1_init_struct.USART_WordLength = USART_WordLength_8b;
|
82 | usart1_init_struct.USART_StopBits = USART_StopBits_1;
|
83 | usart1_init_struct.USART_Parity = USART_Parity_No ;
|
84 | usart1_init_struct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
|
85 | usart1_init_struct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
|
86 | /* Configure USART1 */
|
87 | USART_Init(USART1, &usart1_init_struct);
|
88 | /* Enable RXNE interrupt */
|
89 | USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
|
90 | /* Enable USART1 global interrupt */
|
91 |
|
92 | NVIC_EnableIRQ(USART1_IRQn);
|
93 |
|
94 |
|
95 |
|
96 | }
|
97 |
|
98 | /*******************************************
|
99 | * Toggle LED
|
100 | *******************************************/
|
101 | void led_toggle(void)
|
102 | {
|
103 | /* Read LED output (GPIOA PIN8) status */
|
104 | uint8_t led_bit = GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_2);
|
105 |
|
106 | /* If LED output set, clear it */
|
107 | if(led_bit == (uint8_t)Bit_SET)
|
108 | {
|
109 | GPIO_ResetBits(GPIOB, GPIO_Pin_2);
|
110 | }
|
111 | /* If LED output clear, set it */
|
112 | else
|
113 | {
|
114 | GPIO_SetBits(GPIOB, GPIO_Pin_2);
|
115 | }
|
116 | }
|
117 |
|
118 | /**********************************************************
|
119 | * USART1 interrupt request handler: on reception of a
|
120 | * character 't', toggle LED and transmit a character 'T'
|
121 | *********************************************************/
|
122 | void USART1_IRQHandler(void)
|
123 | {
|
124 | /* RXNE handler */
|
125 | if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
|
126 | {
|
127 | /* If received 't', toggle LED and transmit 'T' */
|
128 | if((char)USART_ReceiveData(USART1) == 't')
|
129 | {
|
130 | led_toggle();
|
131 | USART_SendData(USART1, 'T');
|
132 | /* Wait until Tx data register is empty, not really
|
133 | * required for this example but put in here anyway.
|
134 | */
|
135 | /*
|
136 | while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
|
137 | {
|
138 | }*/
|
139 | }
|
140 | }
|
141 |
|
142 | /* ------------------------------------------------------------ */
|
143 | /* Other USART1 interrupts handler can go here ... */
|
144 | }
|