(5)使能串口
配置好串口后,我们还需要使能它,使能串口库函数如下:
void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState);
例如我们要使能USART1,如下:
USART_Cmd(USART1, ENABLE); //使能串口1
(6)设置串口中断类型并使能
对串口中断类型和使能设置的函数如下:
void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT,FunctionalState NewState);
第一个参数用来选择串口,第二个参数用来选择串口中断类型,第三个参数用来使能或者失能对应中断。由于串口中断类型比较多,所以使用哪种中断,我们就需要对它进行配置。比如在接收到数据的时候( RXNE 读数据寄存器非空),我们要产生中断,那么我们开启中断的方法是:
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启接收中断
又比如我们发送完数据时,要产生中断,可以配置如下:
USART_ITConfig(USART1,USART_IT_TC, ENABLE);
对应的串口中断类型可在stm32f10x_usart.h 中查找到,如下:
#define USART_IT_PE ((uint16_t)0x0028)
#define USART_IT_TXE ((uint16_t)0x0727)
#define USART_IT_TC ((uint16_t)0x0626)
#define USART_IT_RXNE ((uint16_t)0x0525)
#define USART_IT_IDLE ((uint16_t)0x0424)
#define USART_IT_LBD ((uint16_t)0x0846)
#define USART_IT_CTS ((uint16_t)0x096A)
#define USART_IT_ERR ((uint16_t)0x0060)
#define USART_IT_ORE ((uint16_t)0x0360)
#define USART_IT_NE ((uint16_t)0x0260)
#define USART_IT_FE ((uint16_t)0x0160)
(7)设置串口中断优先级,使能串口中断通道
在上一步我们已经使能了串口的接收中断,只要使用到中断,就必需对NVIC初始化,NVIC 初始化库函数是NVIC_Init(),这个在前面讲解STM32 中断时就已经介绍过,不清楚的可以回过头看下。
(8)编写串口中断服务函数
最后我们还需要编写一个串口中断服务函数,通过中断函数处理串口产生的相关中断。串口中断服务函数名在STM32F1 启动文件内就有,USART1 中断函数名如下:
USART1_IRQHandler
因为串口的中断类型有很多,所以进入中断后,我们需要在中断服务函数开头处通过状态寄存器的值判断此次中断是哪种类型,然后做出相应的控制。库函数中用来读取串口中断状态标志位的函数如下:
ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_tUSART_IT);
此函数功能是判断USARTx 的中断类型USART_IT 是否产生中断,例如我们要判断USART1 的接收中断是否产生,可以调用此函数:
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
...//执行USART1 接收中断内控制
}
如果产生接收中断,那么调用USART_GetITStatus 函数后返回值为1,就会进入到if 函数内执行中断控制功能程序。否则就不会进入中断处理程序。在编写串口中断服务函数时,最后通常会调用一个清除中断标志位的函数,如下:
void USART_ClearFlag(USART_TypeDef* USARTx, uint16_t USART_FLAG);
第二个参数为状态标志选项,可选参数可在stm32f10x_usart.h 中查找到,如下:
#define USART_FLAG_CTS
#define USART_FLAG_LBD
#define USART_FLAG_TXE
#define USART_FLAG_TC
#define USART_FLAG_RXNE
#define USART_FLAG_IDLE
#define USART_FLAG_ORE
#define USART_FLAG_NE
#define USART_FLAG_FE
#define USART_FLAG_PE
比如本实验中判断串口进入接收中断后,我们就会把串口接收寄存器内数据读取出来,然后再通过串口发送至上位机,等待发送完成后我们就会清除发送完成标志位
USART_FLAG_TC。代码如下:
void USART1_IRQHandler(void) //串口1 中断服务程序
{
u8 r;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断
{
r =USART_ReceiveData(USART1);//(USART1->DR); //读取接收到的数据
USART_SendData(USART1,r);
while(USART_GetFlagStatus(USART1,USART_FLAG_TC) != SET);
}
USART_ClearFlag(USART1,USART_FLAG_TC);
}
串口接收函数是:
uint16_t USART_ReceiveData(USART_TypeDef* USARTx);
串口发送函数是:
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);
库函数中还有一个函数用来读取串口状态标志位:
FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_tUSART_FLAG); USART_GetITStatus 与USART_GetFlagStatus 功能类似, 区别就是USART_GetITStatus 函数会先判断是否使能串口中断,使能后才读取状态标志,而USART_GetFlagStatus 函数直接读取状态标志。将以上几步全部配置好后,我们就可以正常使用串口中断了。
硬件设计
在开发板上,含有一个USB 转串口,一个RS232 串口,其硬件威廉希尔官方网站
如图所示:
PZ6806L 开发板串口3 威廉希尔官方网站
:
从图中可以看出,通过CH340 芯片把STM32F1 的串口1 与 PC 机的USB 口进行连接,实现串口通信。根据前面介绍,串口通信需将数据收发管脚交叉连接,所以可以看到在CH340 芯片的2 和3 脚已做处理。威廉希尔官方网站
中其他部分是自动下载威廉希尔官方网站
部分,目的是控制BOOT 的启动模式与复位。
STM32F1 使用的是串口3,即PB9 和PB10 管脚。此威廉希尔官方网站
是按照RS232 接口标准搭建,使用了一个DB9 的母头,电平转换芯片使用的是SP3232,与MAX3232 一样。母头可作为下位机和上位机PC 进行串口通信,需使用交叉型串口线。威廉希尔官方网站
中还有一个P232 插针,它是用来选择是USART3 功能还是IIC2 功能,如果我们需要使用这个DB9 做串口通信,需将P232 插针的3、5 短接,4、6 短接,如果做EEPROM 实验时需将P232 插针的1、3 短接,2、4 短接,开发板出厂时P232 插针默认选择的是IIC2 功能。
本章实验所采用的是串口1 与PC 机USB 口进行通信,只需使用一根USB 线连接电脑USB 口即可实现串口通信。若大家需要使用DB9 接口,可以选择图2 威廉希尔官方网站
,此时使用的是串口3,程序和串口1 通信是类似的,只需修改串口号即可。
软件设计
所要实现的功能是:STM32F1 通过USART1 实现与PC 机对话,STM32F1的USART1 收到PC 机发来的数据后原封不动的返回给PC 机显示。同时使用D1指示灯不断闪烁提示系统正常运行。程序框架如下:
(1)初始化USART1,并使能串口接收中断等
(2)编写USART1 中断函数
(3)编写主函数
在前面介绍串口配置步骤时,就已经讲解如何初始化串口。
USART1 初始化函数
要使用串口中断,我们必须先对它进行配置。USART1 初始化代码如下:
/****************************************************************
***************
* 函数名: USART1_Init
* 函数功能: USART1 初始化函数
* 输入: bound:波特率
* 输出: 无
*****************************************************************
**************/
void USART1_Init(u32 bound)
{
//GPIO 端口设置
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
/* 配置GPIO 的模式和IO 口*/
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;//TX //串口输出PA9
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOA,&GPIO_InitStructure);
/* 初始化串口输入IO */
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;//RX //串口输入PA10
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; //模拟输入
GPIO_Init(GPIOA,&GPIO_InitStructure); /* 初始化GPIO */
//USART1 初始化设置
USART_InitStructure.USART_BaudRate = bound;//波特率设置
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8 位数据格式
USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
USART_InitStructure.USART_HardwareFlowControl =
USART_HardwareFlowControl_None;//无硬件数据流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//收发模式
USART_Init(USART1, &USART_InitStructure); //初始化串口1
USART_Cmd(USART1, ENABLE); //使能串口1
USART_ClearFlag(USART1, USART_FLAG_TC);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启相关中断
//Usart1 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口1 中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;// 抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC 寄存器
}
在USART1_Init()函数中,首先使能USART1 串口及端口时钟,并初始化GPIO为复用功能。其次配置串口结构体USART_InitTypeDef,使能串口并开启接收中断,为了防止串口发送状态标志位的影响,我们清除下串口状态标志位(TC),最后配置相应的NVIC 并使能对应中断通道,我们将USART1 的抢占优先级设置为3,响应优先级设置为3。这一过程在前面步骤介绍中已经提了。USART1_Init()函数有一个参数bound,用来设置USART1 串口的波特率,方便大家修改。 USART1 中断函数初始化USART1 后,接收中断就已经开启了,当上位机发送数据过来,STM32F1的串口接收寄存器内即为非空,触发接收中断,具体代码如下:
/****************************************************************
***************
* 函数名: USART1_IRQHandler
* 函数功能: USART1 中断函数
* 输入: 无
* 输出: 无
*****************************************************************
**************/
void USART1_IRQHandler(void) //串口1 中断服务程序
{
u8 r;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断
{
r =USART_ReceiveData(USART1);//(USART1->DR); //读取接收到的数据
USART_SendData(USART1,r);
while(USART_GetFlagStatus(USART1,USART_FLAG_TC) != SET);
}
USART_ClearFlag(USART1,USART_FLAG_TC);
}
为了确认USART1 是否发生接收中断,调用了读取串口中断状态标志位函数USART_GetITStatus,如果确实产生接收中断事件,那么就会执行if 内的语句,将串口接收到的数据保存在变量r 内,然后有通过串口发送出去,通过USART_GetFlagStatus 函数读取串口状态标志,如果数据发送完成,则退出while循环语句,且清除发送完成状态标志位USART_FLAG_TC。
主函数编写好串口初始化和中断服务函数后,接下来就可以编写主函数了,代码如下:
主函数
编写好串口初始化和中断服务函数后,接下来就可以编写主函数了,代码如下:
/****************************************************************
***************
* 函数名: main
* 函数功能: 主函数
* 输入: 无
* 输出: 无
*****************************************************************
**************/
int main()
{
u8 i=0;
SysTick_Init(72);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断优先级分组分2 组
LED_Init();
USART1_Init(9600);
while(1)
{
i++;
if(i%20==0)
{
led1=!led1;
}
delay_ms(10);
}
}
主函数实现的功能很简单,首先调用之前编写好的硬件初始化函数,包括SysTick 系统时钟,中断分组,LED 初始化等。然后调用我们前面编写的USART1初始化函数,这里我们设定串口通信波特率为9600。最后进入while 循环语句,不断让D1 指示间隔200ms 闪烁。如果发生接收中断事件,即会进入中断执行,执行完后回到主函数内继续运行。其实如果你学会了USART1 的使用,对于其他的串口都是类似的。
(5)使能串口
配置好串口后,我们还需要使能它,使能串口库函数如下:
void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState);
例如我们要使能USART1,如下:
USART_Cmd(USART1, ENABLE); //使能串口1
(6)设置串口中断类型并使能
对串口中断类型和使能设置的函数如下:
void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT,FunctionalState NewState);
第一个参数用来选择串口,第二个参数用来选择串口中断类型,第三个参数用来使能或者失能对应中断。由于串口中断类型比较多,所以使用哪种中断,我们就需要对它进行配置。比如在接收到数据的时候( RXNE 读数据寄存器非空),我们要产生中断,那么我们开启中断的方法是:
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启接收中断
又比如我们发送完数据时,要产生中断,可以配置如下:
USART_ITConfig(USART1,USART_IT_TC, ENABLE);
对应的串口中断类型可在stm32f10x_usart.h 中查找到,如下:
#define USART_IT_PE ((uint16_t)0x0028)
#define USART_IT_TXE ((uint16_t)0x0727)
#define USART_IT_TC ((uint16_t)0x0626)
#define USART_IT_RXNE ((uint16_t)0x0525)
#define USART_IT_IDLE ((uint16_t)0x0424)
#define USART_IT_LBD ((uint16_t)0x0846)
#define USART_IT_CTS ((uint16_t)0x096A)
#define USART_IT_ERR ((uint16_t)0x0060)
#define USART_IT_ORE ((uint16_t)0x0360)
#define USART_IT_NE ((uint16_t)0x0260)
#define USART_IT_FE ((uint16_t)0x0160)
(7)设置串口中断优先级,使能串口中断通道
在上一步我们已经使能了串口的接收中断,只要使用到中断,就必需对NVIC初始化,NVIC 初始化库函数是NVIC_Init(),这个在前面讲解STM32 中断时就已经介绍过,不清楚的可以回过头看下。
(8)编写串口中断服务函数
最后我们还需要编写一个串口中断服务函数,通过中断函数处理串口产生的相关中断。串口中断服务函数名在STM32F1 启动文件内就有,USART1 中断函数名如下:
USART1_IRQHandler
因为串口的中断类型有很多,所以进入中断后,我们需要在中断服务函数开头处通过状态寄存器的值判断此次中断是哪种类型,然后做出相应的控制。库函数中用来读取串口中断状态标志位的函数如下:
ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_tUSART_IT);
此函数功能是判断USARTx 的中断类型USART_IT 是否产生中断,例如我们要判断USART1 的接收中断是否产生,可以调用此函数:
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
...//执行USART1 接收中断内控制
}
如果产生接收中断,那么调用USART_GetITStatus 函数后返回值为1,就会进入到if 函数内执行中断控制功能程序。否则就不会进入中断处理程序。在编写串口中断服务函数时,最后通常会调用一个清除中断标志位的函数,如下:
void USART_ClearFlag(USART_TypeDef* USARTx, uint16_t USART_FLAG);
第二个参数为状态标志选项,可选参数可在stm32f10x_usart.h 中查找到,如下:
#define USART_FLAG_CTS
#define USART_FLAG_LBD
#define USART_FLAG_TXE
#define USART_FLAG_TC
#define USART_FLAG_RXNE
#define USART_FLAG_IDLE
#define USART_FLAG_ORE
#define USART_FLAG_NE
#define USART_FLAG_FE
#define USART_FLAG_PE
比如本实验中判断串口进入接收中断后,我们就会把串口接收寄存器内数据读取出来,然后再通过串口发送至上位机,等待发送完成后我们就会清除发送完成标志位
USART_FLAG_TC。代码如下:
void USART1_IRQHandler(void) //串口1 中断服务程序
{
u8 r;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断
{
r =USART_ReceiveData(USART1);//(USART1->DR); //读取接收到的数据
USART_SendData(USART1,r);
while(USART_GetFlagStatus(USART1,USART_FLAG_TC) != SET);
}
USART_ClearFlag(USART1,USART_FLAG_TC);
}
串口接收函数是:
uint16_t USART_ReceiveData(USART_TypeDef* USARTx);
串口发送函数是:
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);
库函数中还有一个函数用来读取串口状态标志位:
FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_tUSART_FLAG); USART_GetITStatus 与USART_GetFlagStatus 功能类似, 区别就是USART_GetITStatus 函数会先判断是否使能串口中断,使能后才读取状态标志,而USART_GetFlagStatus 函数直接读取状态标志。将以上几步全部配置好后,我们就可以正常使用串口中断了。
硬件设计
在开发板上,含有一个USB 转串口,一个RS232 串口,其硬件威廉希尔官方网站
如图所示:
PZ6806L 开发板串口3 威廉希尔官方网站
:
从图中可以看出,通过CH340 芯片把STM32F1 的串口1 与 PC 机的USB 口进行连接,实现串口通信。根据前面介绍,串口通信需将数据收发管脚交叉连接,所以可以看到在CH340 芯片的2 和3 脚已做处理。威廉希尔官方网站
中其他部分是自动下载威廉希尔官方网站
部分,目的是控制BOOT 的启动模式与复位。
STM32F1 使用的是串口3,即PB9 和PB10 管脚。此威廉希尔官方网站
是按照RS232 接口标准搭建,使用了一个DB9 的母头,电平转换芯片使用的是SP3232,与MAX3232 一样。母头可作为下位机和上位机PC 进行串口通信,需使用交叉型串口线。威廉希尔官方网站
中还有一个P232 插针,它是用来选择是USART3 功能还是IIC2 功能,如果我们需要使用这个DB9 做串口通信,需将P232 插针的3、5 短接,4、6 短接,如果做EEPROM 实验时需将P232 插针的1、3 短接,2、4 短接,开发板出厂时P232 插针默认选择的是IIC2 功能。
本章实验所采用的是串口1 与PC 机USB 口进行通信,只需使用一根USB 线连接电脑USB 口即可实现串口通信。若大家需要使用DB9 接口,可以选择图2 威廉希尔官方网站
,此时使用的是串口3,程序和串口1 通信是类似的,只需修改串口号即可。
软件设计
所要实现的功能是:STM32F1 通过USART1 实现与PC 机对话,STM32F1的USART1 收到PC 机发来的数据后原封不动的返回给PC 机显示。同时使用D1指示灯不断闪烁提示系统正常运行。程序框架如下:
(1)初始化USART1,并使能串口接收中断等
(2)编写USART1 中断函数
(3)编写主函数
在前面介绍串口配置步骤时,就已经讲解如何初始化串口。
USART1 初始化函数
要使用串口中断,我们必须先对它进行配置。USART1 初始化代码如下:
/****************************************************************
***************
* 函数名: USART1_Init
* 函数功能: USART1 初始化函数
* 输入: bound:波特率
* 输出: 无
*****************************************************************
**************/
void USART1_Init(u32 bound)
{
//GPIO 端口设置
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
/* 配置GPIO 的模式和IO 口*/
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;//TX //串口输出PA9
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOA,&GPIO_InitStructure);
/* 初始化串口输入IO */
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;//RX //串口输入PA10
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; //模拟输入
GPIO_Init(GPIOA,&GPIO_InitStructure); /* 初始化GPIO */
//USART1 初始化设置
USART_InitStructure.USART_BaudRate = bound;//波特率设置
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8 位数据格式
USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
USART_InitStructure.USART_HardwareFlowControl =
USART_HardwareFlowControl_None;//无硬件数据流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//收发模式
USART_Init(USART1, &USART_InitStructure); //初始化串口1
USART_Cmd(USART1, ENABLE); //使能串口1
USART_ClearFlag(USART1, USART_FLAG_TC);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启相关中断
//Usart1 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口1 中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;// 抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC 寄存器
}
在USART1_Init()函数中,首先使能USART1 串口及端口时钟,并初始化GPIO为复用功能。其次配置串口结构体USART_InitTypeDef,使能串口并开启接收中断,为了防止串口发送状态标志位的影响,我们清除下串口状态标志位(TC),最后配置相应的NVIC 并使能对应中断通道,我们将USART1 的抢占优先级设置为3,响应优先级设置为3。这一过程在前面步骤介绍中已经提了。USART1_Init()函数有一个参数bound,用来设置USART1 串口的波特率,方便大家修改。 USART1 中断函数初始化USART1 后,接收中断就已经开启了,当上位机发送数据过来,STM32F1的串口接收寄存器内即为非空,触发接收中断,具体代码如下:
/****************************************************************
***************
* 函数名: USART1_IRQHandler
* 函数功能: USART1 中断函数
* 输入: 无
* 输出: 无
*****************************************************************
**************/
void USART1_IRQHandler(void) //串口1 中断服务程序
{
u8 r;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断
{
r =USART_ReceiveData(USART1);//(USART1->DR); //读取接收到的数据
USART_SendData(USART1,r);
while(USART_GetFlagStatus(USART1,USART_FLAG_TC) != SET);
}
USART_ClearFlag(USART1,USART_FLAG_TC);
}
为了确认USART1 是否发生接收中断,调用了读取串口中断状态标志位函数USART_GetITStatus,如果确实产生接收中断事件,那么就会执行if 内的语句,将串口接收到的数据保存在变量r 内,然后有通过串口发送出去,通过USART_GetFlagStatus 函数读取串口状态标志,如果数据发送完成,则退出while循环语句,且清除发送完成状态标志位USART_FLAG_TC。
主函数编写好串口初始化和中断服务函数后,接下来就可以编写主函数了,代码如下:
主函数
编写好串口初始化和中断服务函数后,接下来就可以编写主函数了,代码如下:
/****************************************************************
***************
* 函数名: main
* 函数功能: 主函数
* 输入: 无
* 输出: 无
*****************************************************************
**************/
int main()
{
u8 i=0;
SysTick_Init(72);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断优先级分组分2 组
LED_Init();
USART1_Init(9600);
while(1)
{
i++;
if(i%20==0)
{
led1=!led1;
}
delay_ms(10);
}
}
主函数实现的功能很简单,首先调用之前编写好的硬件初始化函数,包括SysTick 系统时钟,中断分组,LED 初始化等。然后调用我们前面编写的USART1初始化函数,这里我们设定串口通信波特率为9600。最后进入while 循环语句,不断让D1 指示间隔200ms 闪烁。如果发生接收中断事件,即会进入中断执行,执行完后回到主函数内继续运行。其实如果你学会了USART1 的使用,对于其他的串口都是类似的。
举报