本文章参考网页http://www.51hei.com/bbs/dpj-190888-1.html
1.实验环境
(1)Keil uVision5
(2)STM32F407ZGT6
2.实验内容
1、实现用正弦波的数值控制LED0闪烁;
2、同时将该控制量送串口输出正弦波波形;
3、用KEY0中断方式控制启动和停止。
按下KEY0, LED0开始闪烁,串口输出波形。
再次按下KEY0, LED0和输出波形都暂停;
第三次按KEY0, LED0和输出波形都能恢复,并和原来的状态衔接上,即保持闪烁的完整性和波形的完整性。
4、 特别重要: 中途重启计算机或做完实验关机时, 必须下载一个其他程序到实验板中,比如实验二跑马灯;或者运行桌面的FlyMCU,点击清除芯片功能。 否则重启计算机后鼠标可能工作不正常。
3.实验代码
【exti.c】
extern int state;//表示当前PWM输出的状态 0-停止,1-启动
extern int sinval;
//外部中断4服务程序
void EXTI4_IRQHandler(void)
{
delay_ms(10); //消抖
if(KEY0==0)
{
if(state==0) state=1;//当前输出波形停止时,
else state=0; //当前正在输出波形时
}
EXTI_ClearITPendingBit(EXTI_Line4);//清除LINE4上的中断标志位
}
【main.c】
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "pwm.h"
#include "exti.h"
#include "key.h"
#include "math.h"
#define PI 3.14159265
int state=0;//表示当前PWM输出的状态 0-停止,1-启动
int sinval=0; //sin()的()里的值
int main(void)
{
double led0pwmval=0; //比较值
int i;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
delay_init(168); //初始化延时函数
uart_init(115200);//初始化串口波特率为115200
EXTIX_Init();//初始化外部中断输入
TIM14_PWM_Init(500-1,84-1); //84M/84=1Mhz的计数频率,重装载值500,所以PWM频率为 1M/500=2Khz.
while(1) //实现比较值从0-300递增,到300后从300-0递减,循环
{
delay_ms(10);
if(sinval>=360)sinval=0;//sinval到达360后,一个周期的正弦波结束,从0继续重新开始
if(state==1)
{
led0pwmval=sin(sinval*PI/180)*150+150;//[-150,150]--->[0,300]
if(sinval%3==0)//输出波形
{
for(i=0;i<led0pwmval/3;i++)//空格
printf(" ");
printf("*\r\n");//\r表示回车到本行首行
}
TIM_SetCompare1(TIM14,led0pwmval); //修改比较值,修改占空比
sinval=sinval+4;//[0,360]--->[0,2Π]
}
else
TIM_SetCompare1(TIM14,0); //修改比较值,修改占空比
}
}
4.注意事项
(1)串口助手要取消时间戳。