stm32 freertos 之串口中断

一、中断处理函数

void USART1_IRQHandler(void)
{
	BaseType_t xHigherPriorityTaskWoken;
   xHigherPriorityTaskWoken = pdFALSE;
	u8 cChar;
	if(USART_GetITStatus (USART1,USART_IT_RXNE)!=RESET)
	{
		cChar=USART_ReceiveData(USART1);
		xQueueSendToBackFromISR (xQueueRx,&cChar,&xHigherPriorityTaskWoken);
		portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
	}
}

二、中断向量表配置

void NVIC_Configuration(void)
{
	NVIC_InitTypeDef  NVIC_InitStructure;
	NVIC_PriorityGroupConfig (NVIC_PriorityGroup_4);
	
	NVIC_InitStructure .NVIC_IRQChannel =USART1_IRQn  ;
	NVIC_InitStructure .NVIC_IRQChannelPreemptionPriority =6;
	NVIC_InitStructure .NVIC_IRQChannelCmd =ENABLE ;
	NVIC_Init(&NVIC_InitStructure );

}

三、串口接收任务创建

xQueueHandle xQueueRx;
void vPC_Communication_Task(void *pvParameters)
{
		BaseType_t xHigherPriorityTaskWoken;
		xHigherPriorityTaskWoken = pdFALSE;
		u8 rx=0;
		xQueueRx=xQueueCreate(20,sizeof(u8));
	
		while(1)
		{
			if(xQueueReceiveFromISR(xQueueRx,&rx,&xHigherPriorityTaskWoken))
			{
					printf("%c\r\n",rx);
			}
			vTaskDelay(1000/portTICK_RATE_MS );
		}

}

四、主函数

int main(void)
{
    BSP_INIT();	

    xTaskCreate(vLED_Task ,"led_task",50,NULL,1,NULL);
    xTaskCreate(vPC_Communication_Task,"vPC_Communication_Task",500,NULL,2,NULL);				
    vTaskStartScheduler();		
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值