01 |
#include |
02 |
#include "system.h" |
03 |
#include "usart.h" |
04 |
#include "stdio.h" |
05 |
06 |
#define PRINTF_ON 0 //设置printf() 输出 |
07 |
#define RECEIVE_SEND_BACK 0 //设置接收信息后原文发送 |
08 |
#define SEND_WORDS 1 //设置发送字符串 |
09 |
10 |
void Gpio_Init( void ); |
11 |
12 |
vu8 RxBuffer[]= "\r\n i will success finally..\r\n" ; |
13 |
14 |
int main( void ) |
15 |
{ |
16 |
u32 i=0; |
17 |
18 |
Rcc_Init(9); //系统时钟设置 |
19 |
20 |
Usart1_Init(72,9600); //设置系统时钟和波特率 |
21 |
22 |
#if RECEIVE_SEND_BACK |
23 |
Nvic_Init(3,3,USART1_IRQChannel,2); |
24 |
#endif |
25 |
26 |
Gpio_Init(); //配置串口寄存器时可能导致IO口输出,最后配置最好 |
27 |
28 |
#if PRINTF_ON |
29 |
printf ( "\r\nThanks god ,i am success now..\r\n" ); |
30 |
#elif SEND_WORDS |
31 |
while ( sizeof (RxBuffer)>=i) |
32 |
{ |
33 |
USART1->DR = RxBuffer[i]; |
34 |
while ((USART1->SR&0x40) == 0); |
35 |
//USART1->SR &= 0x1F; //清除TC中断 |
36 |
i++; |
37 |
} |
38 |
#endif |
39 |
|
40 |
|
41 |
while (1); |
42 |
} |
43 |
44 |
45 |
void Gpio_Init( void ) |
46 |
{ |
47 |
RCC->APB2ENR|=1<<2; //使能PORTA时钟 |
48 |
49 |
//GPIOA->CRL&=0x0000FFFF; // PA0~3设置为浮空输入,PA4~7设置为推挽输出 |
50 |
//GPIOA->CRL|=0x33334444; |
51 |
52 |
//USART1 串口I/O设置 |
53 |
54 |
GPIOA -> CRH&=0xFFFFF00F; //设置USART1 的Tx(PA.9)为第二功能推挽,50MHz;Rx(PA.10)为浮空输入 |
55 |
GPIOA -> CRH|=0x000008B0; |
56 |
} |
01 |
#include "stm32f10x_it.h" |
02 |
03 |
void USART1_IRQHandler( void ) |
04 |
{ |
05 |
vu8 data; |
06 |
07 |
if (USART1->SR &(1<<5)) //接收到数据 |
08 |
{ |
09 |
data = USART1->DR; |
10 |
USART1->DR = data; |
11 |
while ((USART1->SR&0x40) == 0); |
12 |
} |
13 |
} |
01 |
#include |
02 |
#include "usart.h" |
03 |
04 |
/** |
05 |
* 初始化 USART1的控制寄存器、波特比率寄存器、开启时钟 |
06 |
* 注意:未配置I/O口功能,需设置USART1 的Tx(PA.9)为第二功能推挽,50MHz;Rx(PA.10)为浮空输入 |
07 |
*/ |
08 |
09 |
void Usart1_Init(u32 clk,u32 baudRate) //参数说明: clk 单位为Mhz |
10 |
{ |
11 |
//USART1->BBR 波特比率设置 |
12 |
float temp; |
13 |
14 |
u16 BRR_Value; |
15 |
u16 BRR_Mantissa; |
16 |
u16 BRR_Fraction; |
17 |
18 |
temp = ( float )(clk*1000000)/(baudRate*16); //得到USART 分频除法因子(每个字符16位,乘16得到每秒通过的字符数) |
19 |
20 |
BRR_Mantissa = temp; //得到BRR[15:4]整数部分 |
21 |
22 |
BRR_Fraction = (temp - BRR_Mantissa)*16; //得到BRR[3:0]小数部分 |
23 |
24 |
BRR_Mantissa<<=4; |
25 |
26 |
BRR_Value = BRR_Mantissa + BRR_Fraction; //拼接整数和小数部分 |
27 |
|
28 |
RCC->APB2ENR|=1<<14; //使能串口时钟 |
29 |
30 |
RCC->APB2RSTR |= 1<<14; //复位串口1 |
31 |
RCC->APB2RSTR &= ~(1<<14); //初始化串口复位寄存器位 |
32 |
33 |
USART1->BRR = BRR_Value; //设置波特比率 |
34 |
35 |
USART1->CR1 |= 1<<8; //PEIE中断使能 |
36 |
USART1->CR1 |= 1<<5; //RXNEIE,接收完成中断使能 |
37 |
//USART1->CR1 |= 1<<6; //TC,发送完成中断使能 |
38 |
39 |
USART1->CR1 |= 0x200C; //1个停止位,无检验位 |
40 |
41 |
|
42 |
} |
43 |
44 |
45 |
#if PRINTF_OUT |
46 |
#pragma import(__use_no_semihosting) |
47 |
//标准库需要的支持函数 |
48 |
struct __FILE |
49 |
{ |
50 |
int handle; |
51 |
/* Whatever you require here. If the only file you are using is */ |
52 |
/* standard output using printf() for debugging, no file handling */ |
53 |
/* is required. */ |
54 |
}; |
55 |
/* FILE is typedef’ d in stdio.h. */ |
56 |
FILE __stdout; |
57 |
//定义_sys_exit()以避免使用半主机模式 |
58 |
_sys_exit( int x) |
59 |
{ |
60 |
x = x; |
61 |
} |
62 |
//重定义fputc函数 |
63 |
int fputc ( int ch, FILE *f) |
64 |
{ |
65 |
USART1->DR = (u8) ch; |
66 |
while ((USART1->SR&0X40)==0); //循环发送,直到发送完毕 |
67 |
return ch; |
68 |
} |
69 |
#endif |
01 |
#include |
02 |
03 |
#define PRINTF_OUT 1 //使用printf()方式输出,使用这种方式会增大hex文件大小,所以不适用这种方式输出就置0 |
04 |
05 |
#if PRINTF_OUT |
06 |
#include "stdio.h" |
07 |
#endif |
08 |
09 |
10 |
void Usart1_Init(u32 clk,u32 baudRate); |
001 |
#include "stm32f10x.h" |
002 |
#include "stdio.h" |
003 |
004 |
#define PRINTF_ON 0 //设置printf() 输出 |
005 |
#define RECEIVE_SEND_BACK 0 //设置接收信息后原文发送 |
006 |
#define SEND_WORDS 1 //设置发送字符串 |
007 |
008 |
vu8 RxBuffer[]= "\r\n i will success finally..\r\n" ; //存储串口传入的数据,自定义字符串 |
009 |
vu32 count=0; |
010 |
011 |
void RCC_Configuration( void ); |
012 |
void GPIO_Configuration( void ); |
013 |
void USART_Configuration( void ); |
014 |
void delay(vu32 x); |
015 |
016 |
017 |
int main( void ) |
018 |
{ |
019 |
RCC_Configuration(); |
020 |
GPIO_Configuration(); |
021 |
USART_Configuration(); |
022 |
while (1) |
023 |
{ |
024 |
#if PRINTF_ON |
025 |
printf ( "\r\nThanks god ,i am success now..\r\n" ); |
026 |
#elif RECEIVE_SEND_BACK |
027 |
if (USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==SET) |
028 |
{ |
029 |
RxBuffer[count] = USART_ReceiveData(USART1); |
030 |
USART_SendData(USART1,RxBuffer[count]); |
031 |
delay(5); |
032 |
} |
033 |
#elif SEND_WORDS |
034 |
035 |
USART_SendData(USART1,RxBuffer[count]); |
036 |
|
037 |
while (USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET); |
038 |
//while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET); //检查是否发送完成的另一种方法 |
039 |
040 |
count++; |
041 |
|
042 |
if ( sizeof (RxBuffer) |
043 |
{ |
044 |
count=0; |
045 |
break ; //只发送一次 |
046 |
} |
047 |
|
048 |
#endif |
049 |
} |
050 |
051 |
} |
052 |
053 |
054 |
void delay(vu32 x) //vu32 1us一次 |
055 |
{ |
056 |
vu32 a=100*x/7; |
057 |
while (--x); |
058 |
} |
059 |
060 |