USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);这个是判断串口是否触发接受(USART_IT_RXNE)中断,如果为发送中断则为(USART_IT_TXE),若产生中断则接受产生的8位2进制数据,而那个i的设置我猜测是楼主要接受字符串而设定的初值,发送完成则晴空标志位
函数是放在stm32f10x_itc中的 中断名称都是固定的stm32f10x_ith 中有一些可以作为参考。 写完中断函数不要忘记 设置中断向量入口地址 和中断向量组 开相应的中断!就可以了
使用中断接收发送方式,可随时响应串口的接收发送请求,提高串口响应时间;
在程序上 *** 作步骤如下:
首先:在void RCC_Configuration(void)中配置好串口时钟;及在void GPIO_Configuration(void)配置好管脚;
RCC_PCLK2Config(RCC_HCLK_Div1); //串口波特率的确定
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA||RCC_APB2Periph_USART1, ENABLE);
/ Configure USART1 RTS (PA12) and USART1 Tx (PA9) as alternate function push-pull 根据资料可查得各管脚对应/
GPIO_InitStructureGPIO_Pin =GPIO_Pin_9;
GPIO_InitStructureGPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructureGPIO_Mode = GPIO_Mode_AF_PP; //推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure);
其次:在 void NVIC_Configuration(void)函数中使能串口中断;
/ Enable the USART1 Interrupt /
NVIC_InitStructureNVIC_IRQChannel = USART1_IRQChannel; //通道设置为串口1中断(故后面应选择在“void USART1_IRQHandler(void)”开中断)
NVIC_InitStructureNVIC_IRQChannelPreemptionPriority = 0; //中断占先等级0
NVIC_InitStructureNVIC_IRQChannelSubPriority = 0; //中断响应优先级0
NVIC_InitStructureNVIC_IRQChannelCmd = ENABLE; //打开中断
NVIC_Init(&NVIC_InitStructure);
其次。配置好串口,并开中断
/ Enable the USART1 Interrupt /
NVIC_InitStructureNVIC_IRQChannel = USART1_IRQChannel; //通道设置为串口1中断(故后面应选择在“void USART1_IRQHandler(void)”开中断)
NVIC_InitStructureNVIC_IRQChannelPreemptionPriority = 0; //中断占先等级0
NVIC_InitStructureNVIC_IRQChannelSubPriority = 0; //中断响应优先级0
NVIC_InitStructureNVIC_IRQChannelCmd = ENABLE; //打开中断
NVIC_Init(&NVIC_InitStructure);
最后,可在stm32f10x_itc中的void USART1_IRQHandler(void)函数里写上串口中断发生时中断服务函数即可;
u8 RX_dat; //定义字符变量
if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //判断发生接收中断
{
RX_dat=(USART_ReceiveData(USART1) & 0x7F); //接收数据,整理除去前两位
USART_ClearITPendingBit(USART1, USART_IT_RXNE); //清除中断标志
while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET){}//等待接收结束
// USART_ITConfig(USART1, USART_IT_RXNE, DISABLE); //关中断
USART_SendData(USART1,RX_dat); //发送数据
}
程序实现功能:当有数据通过串口发送过来时,程序进入串口中断服务程序,在中断服务程序中发送接收到的数据;
我看了一下代码
#define TIM_IT_Update ((uint16_t)0x0001)
#define TIM_FLAG_Update ((uint16_t)0x0001)
这两个值是一样的,用起来不会错但是代码不规范,两处地方都应该改用TIM_IT_Update,这样不会让人误解。
FlagStatus TIM_GetFlagStatus(TIM_TypeDef TIMx, uint16_t TIM_FLAG)
ITStatus TIM_GetITStatus(TIM_TypeDef TIMx, uint16_t TIM_IT)
这两个函数唯一的区别是中断函数TIM_GetITStatus()中多出来的itenable = TIMx->DIER & TIM_IT;
if ((itstatus != (uint16_t)RESET) && (itenable != (uint16_t)RESET))
对TIM的DIER寄存器额外进行了判断,才能执行time++
stm32f10x_itc中点中断服务函数调用其他文件的函数能通过编译但会出现警告,最好把相关的头文件添加进去就可以。
使用其他文件的全局变量一定要添加外部变量声明extern,如:
在AAAc中声明unsigned char a=0;
在BBBc中要调用该变量的话要也要声明extern unsigned char a;
以上就是关于STM32串口函数求教,这是什么函数啊,有什么作用全部的内容,包括:STM32串口函数求教,这是什么函数啊,有什么作用、STM32v3.5.0库函数stm32f10x_it.c中没有EXTI0中断函数、stm32 串口中断发送和接收怎么回事,就是串口的中断方式和查询方式有什么区别等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)