今天继续分享,使用PWM模块。今天利用PWM模块,做一个呼吸灯的应用,并从串口上打印出来相关的设置数值。具体步骤如下:
一, 添加PWM、INTERRUPT(添加2个)、UART模块。
二, 对PWM模块进行设置,注意红色方框设定的值。频率设置是PWM信号的频率设置,DUTY占空比是一个周期内的高电平周期,这里设置为50%。
选择事件设定,这里选择2个事件,compare 是用于匹配波形占空比设置的,period是用于匹配周期时间的。
具体的事件解释如下图:
三, 设置PWM模块的HW信号连接。具体截图如下:
四, 配置UART的设置。设置为非中断模式的发送模式,9600-8-1-n。
五, 编写main程序。分别添加compare_match_handler()和period_match_handler()
中断处理函数。
六、 具体代码如下,这里实现了占空比连续增加,到达最大值后再减小。另外实现另一个LED周期性翻转,用来检验是否执行了period_match_handler()函数。
- /*
- * main.c
- *
- * Created on: 2019 Jan 29 21:23:36
- * Author: ????
- */
- #include <DAVE.h> //Declarations from DAVE Code Generation (includes SFR declaration)
- /**
- * [url=home.php?mod=space&uid=159083]@brief[/url] main() - Application entry point
- *
- * <b>Details of function</b><br>
- * This routine is the application entry point. It is invoked by the device startup code. It is responsible for
- * invoking the APP initialization dispatcher routine - DAVE_Init() and hosting the place-holder for user application
- * code.
- */
- static uint32_t duty =100;
- uint8_t value[10];
- int main(void)
- {
- DAVE_STATUS_t status;
- status = DAVE_Init(); /* Initialization of DAVE APPs */
- if(status != DAVE_STATUS_SUCCESS)
- {
- /* Placeholder for error handler code. The while loop below can be replaced with an user error handler. */
- XMC_DEBUG("DAVE APPs initialization failed\n");
- while(1U)
- {
- }
- }
- PWM_Start(&PWM_0);
- /* Placeholder for user application code. The while loop below can be replaced with user application code. */
- while(1U)
- {
- sprintf(value,"%d",duty);
- UART_Transmit(&UART_0,"Duty Set Value:",15);
- UART_Transmit(&UART_0,value,sizeof(value));
- UART_Transmit(&UART_0,"\r\n",2);
- }
- }
- void compare_match_handler()
- {
- static bool decrement_duty =(bool)false;
- if(decrement_duty != false)
- {
- duty =duty-100;
- if (duty <= 100)
- {
- decrement_duty = false;
- }
- }
- else
- {
- duty =duty+100;
- if (duty >= 10000)
- {
- decrement_duty = true;
- }
- }
- PWM_SetDutyCycle(&PWM_0,duty);
- PWM_ClearEvent(&PWM_0,PWM_INTERRUPT_COMPAREMATCH );
- }
- void period_match_handler(){
- DIGITAL_IO_ToggleOutput(&LED_1);
- PWM_ClearEvent(&PWM_0,PWM_INTERRUPT_PERIODMATCH );
- }
七、 编译下载运行程序,结果如下。两个led灯一个灯会呼吸,一个led灯会闪烁。
程序运行也录好了视频,网络问题无法上传,后续会更新相关的视频。
另外使用DAVE的APP模式编程时需要注意,只要对APP模块的应用做了修改,就必须重新产生代码,必须重新产生代码,必须重新产生代码。
好了,今天分享结束。
下次继续分享,同时之前也按照其他网友的帖子跑了跑lwip和http服务器,我会将具体操作过程细化,后面再跟大家分享一下。