STM32 学习笔记 —— 基于ucgui ucos的LED的PWM亮度控制和ADC实时采样显示程序

这篇博客详细介绍了如何基于STM32、ucos和ucgui库,将ADC实时采样与PWM控制LED亮度的功能整合到一个程序中。博主首先分析了ucos程序的结构,包括任务建立、系统初始化配置、头文件修改和界面设计。在实际操作中,重点讲述了系统硬件初始化的修改,如时钟配置、GPIO和定时器的设置,以及ADC和DMA的配置。此外,还讨论了任务和界面的调整,特别是如何利用滑动条控制PWM占空比来改变LED亮度,并在屏幕上显示ADC采样值。
摘要由CSDN通过智能技术生成

写一个ucgui ucos程序,实现ADC通道实时采样并在屏幕显示,以及用滑动条控制LED灯亮度的功能

程序蓝本为奋斗stm32配套例程中的ucgui ucos ADC程序和LED显示控制程序。板子是奋斗最新款的V5.2。

其中ADC程序的功能是实时采样ADC通道10和通道11的电压值,通过屏幕实时显示并通过串口发送;LED闪烁程序的功能是通过滑动条和串口控制LED1,LED2和LED3的闪烁间隔,并显示串口通信的内容。在我们自己的程序里,需要截取原程序的部分功能,并加以修改,最后整合成一个新的程序。但是,和例程不同的地方不仅是要在一个新的程序里实现原来两个程序的功能,对LED的控制也不是调整闪烁的间隔,而是通过定时器输出PWM波控制亮度。这种控制方法可以参考PWM波呼吸灯的例程。由于现有的呼吸灯例程并不是基于ucos系统的,首先我们要对原来的程序进行移植,然后再进行两个程序的功能整合。

现在让我们一步一步开始撸代码之旅吧~(本文略长,请耐心食用)

1.ucos程序移植

首先分析一个ucgui ucos程序各部分的结构。

目录结构:需要修改的地方集中在APP文件夹(存放app.c, Fun.c, demo.h等)FWLib文件夹(存放库文件)和BSP(存放系统初始化文件bsp.c)

1.任务的建立与管理

先分析app.c文件,它实现的是系统的任务创建和任务实现的功能。在文件的开头是一些变量定义和函数声明,由于我们在整合程序的时候没有创建新的任务,因此不需要修改(我采用的是修改任务执行程序的方法,而不是删除后再重新建立任务,这样会简单一些)。在这些变量定义和函数声明之后是main主函数,可以看到主函数中有这样的语句:

/* ucosII 初始化 */
   OSInit();  
                                                
/* 硬件平台初始化 */
   BSP_Init(); 

……

//建立主任务,优先级最高
os_err = OSTaskCreate((void (*) (void *)) App_TaskStart,  //指向任务代码的指针
                          (void *) 0,			//任务开始执行时,传递给任务的参数的指针
               		     (OS_STK *) &App_TaskStartStk[APP_TASK_START_STK_SIZE - 1],	
                         //分配给任务的堆栈栈顶指针
                         (INT8U) APP_TASK_START_PRIO);	//任务优先级
OSTimeSet(0);			 //ucosII 节拍计数器清零
OSStart();               //启动ucos内核

可以看出主函数的功能包括:硬件和软件的初始化,一些全局变量的定义,并且创建了主任务,最后启动ucos内核。

在主函数后面的包括App_TaskStart(void* p_arg)函数和App_TaskCreate(void)函数,前者通过统计任务(在主函数中创建
)建立其他的任务,后者依次对各个子任务进行初始化。以LED闪烁任务为例,一个子任务的初始化包括下面内容:


OSTaskCreateExt(Task_Led1,//指向任务代码的指针
   	(void *)0,//传递给任务的参数的指针
	(OS_STK *)&Task_Led1Stk[Task_Led1_STK_SIZE-1],//任务堆栈栈顶指针
	Task_Led1_PRIO,//任务优先级
	Task_Led1_PRIO,//预备给以后版本的特殊标识符,和当前任务同优先级
	(OS_STK *)&Task_Led1Stk[0],//栈底指针
    Task_Led1_STK_SIZE,//堆栈容量
    (void *)0,//用户附加数据域指针,用于扩展任务控制块
    OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR);//选项

对上面的一些名词进行解释:

• 任务堆栈:上下文切换的时候用来保存任务的工作环境,就是STM32的内部寄存器值。

• 任务控制块:任务控制块用来记录任务的各个属性。

• 任务函数:由用户编写的任务处理代码。

我们重点关注的是任务优先级,但是在这次的程序中,任务优先级不需要修改。不过在创建,删除任务以及多任务整合时,需要特别关注优先级的配置,否则常常达不到想要的效果

在ucos系统中,任务优先级的分配方式为0-63,0为最高优先级,64为最低优先级;系统保留了最高和最低4个优先级,因此用户实际可以使用的优先级只有56个

接下来就是各个任务的执行函数,在这个程序中我们要对控制LED的任务Task_Led1进行修改;

在任务执行函数(包括用户界面任务,触屏任务,LED闪烁任务和ADC任务)后面,是一些任务执行中需要调用的函数,比如原先的串口通信任务中需要定义的整型数据转字符串函数和串口格式化输出函数,作为任务的补充部分。整个app.c最后面的部分是一些系统相关的函数,在这个例子中也不需要修改。

总结:app.c文件实现了任务的创建,管理和定义。

2.系统初始化的配置

系统初始化是一个比较繁琐的过程,同时也需要很细心。系统配置任何一个地方出错都会直接导致程序无法呈现预期的效果。一开始我也是因为忘记开时钟导致PWM始终无法输出,无论检查多少次app.c或者修改任务优先级都没有用。stm32里面需要用到的寄存器和各个硬件模块的工作模式都比较复杂,所以在这一步一定要对照stm32参考手册或者例程一步一步修改。事实上在建立一个

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值