微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > stm32 NRF24L01+USART搞定有线和无线通信

stm32 NRF24L01+USART搞定有线和无线通信

时间:11-19 来源:互联网 点击:

串口和无线接收中断子程序

下位机部分

上面说过一般具有远程通信能力的嵌入式系统其下位机部分往往要干很多事,这里我们采用stm32作为MCU并搭载uc-OS实时操作系统负责任务调度,同时采用7寸TFT彩屏和uc-GUI设计可视化人机交互界面。其中任务包括主任务、界面任务和触摸任务,主任务负责建立其他任务,界面任务中将包含整个人机交互界面的界面刷新逻辑,触摸任务负责获取触摸位置数据获取~

这里我们还是得从main函数先说起:首先在main函数中进行相关初始化,然后建立主任务并启动uc-OS内核;接着在主任务中调用App_TaskCreate();分别建立界面任务和触摸任务(如下每个任务的建立类似,要给出指向任务代码的指针、任务执行时传递给任务的参数的指针,分配给这个任务的栈信息,任务优先级等)。这样当任务建立好之后,其执行权就由操作系统调度了~

1 static  void App_TaskCreate(void)2 {3    /*  建立用户界面任务 */4    OSTaskCreateExt(AppTaskUserIF,                                               //指向任务代码的指针5                        (void *)0,                                                   //任务开始执行时,传递给任务的参数的指针6                        (OS_STK *)&AppTaskUserIFStk[APP_TASK_USER_IF_STK_SIZE-1],  //分配给任务的堆栈的栈顶指针   从顶向下递减7                     APP_TASK_USER_IF_PRIO,                                       //分配给任务的优先级8                     APP_TASK_USER_IF_PRIO,                                       //预备给以后版本的特殊标识符,在现行版本同任务优先级9                     (OS_STK *)&AppTaskUserIFStk[0],                               //指向任务堆栈栈底的指针,用于堆栈的检验10                     APP_TASK_USER_IF_STK_SIZE,                                    //指定堆栈的容量,用于堆栈的检验11                     (void *)0,                                                    //指向用户附加的数据域的指针,用来扩展任务的任务控制块12                     OS_TASK_OPT_STK_CHKOS_TASK_OPT_STK_CLR);                    //选项,指定是否允许堆栈检验,是否将堆栈清0,任务是否要13                                                                                 //进行浮点运算等等。14                     15    /* 建立触摸驱动任务 */16    OSTaskCreateExt(AppTaskKbd,17                        (void *)0,18                     (OS_STK *)&AppTaskKbdStk[APP_TASK_KBD_STK_SIZE-1],19                     APP_TASK_KBD_PRIO,20                     APP_TASK_KBD_PRIO,21                     (OS_STK *)&AppTaskKbdStk[0],22                     APP_TASK_KBD_STK_SIZE,23                     (void *)0,24                     OS_TASK_OPT_STK_CHKOS_TASK_OPT_STK_CLR);   25 26 }

这里以界面任务为例:因为我们在建立界面任务时已经指定其任务代码指针AppTaskUserIF,所以这里来写其对应的函数(也就是说这里是界面任务的入口)。从下面的代码可以看出进入界面任务时首先对uc-GUI进行初始化,然后进入死循环不断执行Fun()函数(有人会疑惑:这里while死循环不就只能死在这里吗?怎么执行其他任务呢?,这就是具有操作系统和不具有操作系统的不同啦~虽然这里是while死循环,但是当OS要把CPU占有权分给其他任务时就会把当前执行的任务的信息压入其对应的栈空间,当再次要把CPU分配给该任务时,则把栈里保存的上次执行的情况拿出来继续执行,从而实现抢占与多任务的效果!)

1 static  void  AppTaskUserIF (void *p_arg)2 {                                               3  (void)p_arg;                                    4   GUI_Init();                    //ucgui初始化 5   while(1) 6   {    7      Fun();                     //界面主程序8   }9 }

所以接下来我们主要看Fun.c里的Fun函数:虽然代码有点长,但是很好理解,其核心思路就是建立整个界面并对界面中的每个控件进行相关设置同时获得其句柄,在最后又进入了while死循环,在循环中不断检测2.4G是否接受到数据(和适配器端类似也是中断子程序中收数据然后置接收标志为1的),然后根据从2.4G收到的数据来刷新文本显示区;下面一个if判断speed_change_flag是

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top