1、编写UART_2串口发送程序时,初始化需要设置哪些参数
波特率(Baud Rate):确定数据传输速率。
数据位(Data Bits):指定每个字符的数据位数。
停止位(Stop Bits):指定每个字符之后停止位的位数。
校验位(Parity Bits):用于校验数据传输的正确性。
控制流(Flow Control):包括硬件流控和软件流控,用于控制数据的流动。
时钟使能(Clock Enable):确保UART模块有时钟信号运行。
引脚配置(Pin Configuration):配置UART的发送和接收引脚连接。
中断使能(Interrupt Enable):允许触发接收、发送和错误中断,以实现异步数据收发和错误处理。
2、假设速度为115200,系统时钟为72MHz,波特率寄存器BRR中的值应该是多少?
标志位为1时:
寄存器BRR的值为1250
标志位为0时:
寄存器BRR的值为625
3、中断向量表在哪个文件中?表中有多少项?
在startup_stm32l431rctx.s文件中,具体路径为03_MCU\startup\startup_stm32l431rctx.s
表中一共有99项
4、以下是中断源使能函数,假设中断源为TIM6,将函数实例化(写出各项具体数值)。
5、假设将UART_2和TIM6交换其在中断向量表中的位置和IRQ号, UART_2可以正常中断吗?
在不交换的情况下,能成功地执行UART_2中断处理函数。
在中断向量表中交换UART_2和TIM6的位置和IRQ号后,UART_2仍然可以正常中断,但需要在代码中使用新的中断号来引用UART_2的中断。
1、用构件调用方式实现
uint8_t fp = 0;
char rec; //保存接收的字符
//(1.5)用户外设模块初始化
gpio_init(LIGHT_BLUE,GPIO_OUTPUT,LIGHT_OFF); //初始化蓝灯
gpio_init(LIGHT_GREEN,GPIO_OUTPUT,LIGHT_OFF); //初始化绿灯
gpio_init(LIGHT_RED,GPIO_OUTPUT,LIGHT_OFF); //初始化红灯
uart_init(UART_User,115200); //初始化串口模块
for (;;)
{
rec = (char) uart_re1(UART_User, &fp);
if(fp){ //判断是否接收到数据
if(rec == 'R'){
gpio_set(LIGHT_GREEN,LIGHT_OFF);
gpio_set(LIGHT_BLUE,LIGHT_OFF);
gpio_set(LIGHT_RED,LIGHT_ON);
rec+=1;
uart_send1(UART_User,rec);
}else if(rec == 'G'){
gpio_set(LIGHT_BLUE,LIGHT_OFF);
gpio_set(LIGHT_RED,LIGHT_OFF);
gpio_set(LIGHT_GREEN,LIGHT_ON);
rec+=1;
uart_send1(UART_User,rec);
}else if(rec == 'B'){
gpio_set(LIGHT_RED,LIGHT_OFF);
gpio_set(LIGHT_GREEN,LIGHT_OFF);
gpio_set(LIGHT_BLUE,LIGHT_ON);
rec+=1;
uart_send1(UART_User,rec);
}else{
gpio_set(LIGHT_RED,LIGHT_OFF);
gpio_set(LIGHT_GREEN,LIGHT_OFF);
gpio_set(LIGHT_BLUE,LIGHT_OFF);
rec+=1;
uart_send1(UART_User,rec);
}
}
}
2、UART部分用直接地址方式实现(即不调用uart.c中的函数,其他部分如GPIO、中断设置可调用函数)。
//uart寄存器相关地址
volatile uint32_t* uart_isr=0x4000441CUL; // UART中断和状态寄存器基地址
volatile uint32_t* uart_tdr=0x40004428UL; // UART发送数据寄存器
volatile uint32_t* uart_rdr=0x40004424UL; // UART接收数据寄存器
void USART2_IRQHandler(void)
{
uint8_t ch;
uint8_t flag;
uint32_t t1;
uint32_t t2;
DISABLE_INTERRUPTS; //关总中断
//接收一个字节的数据
for (t1 = 0; t1 < 0xFBBB; t1++)//查询指定次数
{
//判断接收缓冲区是否满
if((*uart_isr)&(1<<5))
{
ch=*uart_rdr; //获取数据
*uart_isr &= ~(1<<5); //清接收中断位
flag = 1; //接收成功
break;
}
}
if(t1 >= 0xFBBB)
{
ch = 0xFF;
flag = 0; //未收到数据
}
if(flag) //有数据
{
for (t2 = 0; t2 < 0xFBBB; t2++)//查询指定次数
{
//发送缓冲区为空则发送数据,发送数据寄存器收到的字节+1
if((*uart_isr)&(1<<7))
{
*uart_tdr=ch+1;
break;
}
}
if (t2 >= 0xFBBB)
return 0; //发送超时,发送失败
if(ch=='R')
{
//红灯亮
gpio_set(LIGHT_RED,LIGHT_ON);
gpio_set(LIGHT_GREEN,LIGHT_OFF);
gpio_set(LIGHT_BLUE,LIGHT_OFF);
}
else if(ch=='G')
{
//绿灯亮
gpio_set(LIGHT_RED,LIGHT_OFF);
gpio_set(LIGHT_GREEN,LIGHT_ON);
gpio_set(LIGHT_BLUE,LIGHT_OFF);
}
else if(ch=='B')
{
//蓝灯亮
gpio_set(LIGHT_RED,LIGHT_OFF);
gpio_set(LIGHT_GREEN,LIGHT_OFF);
gpio_set(LIGHT_BLUE,LIGHT_ON);
}
else //当接收非字符R、G、B时
{
//所有灯都暗
gpio_set(LIGHT_RED,LIGHT_OFF);
gpio_set(LIGHT_GREEN,LIGHT_OFF);
gpio_set(LIGHT_BLUE,LIGHT_OFF);
}
}
ENABLE_INTERRUPTS; //开总中断
}