情况分析
大三老油条一枚,大一时赶上19年国赛申请留校一月自学(划水)开赛以后就和队友参观了一下其他队伍准备的情况就愉快的回家了。(材料都没买),因为疫情的原因大二的省赛推迟到了大三。趁着考研压力还不是特别大,冲一把。
水平一般,之前学51花了不少时间。用51自己从0开始做了一个避障和蓝牙遥控的智(zhi)能(zhang)小车,学习51也算是告一段落。不得不说,学习51的经历对于上手stm32还是帮助很大的。花了大概十天左右时间看完IO、串口、定时器、中断和PWM输出的内容以后,正好今年的材料清单有小车就打算加个LCD屏显结合一下。
踩坑分享
学习32例程的过程中也是遇到些问题,大部分都挺低级的,简单一提提醒自己。
1.配置IO口时钟初始化语句clockcmd用错(有好几个看着很像的就用错了)
2.关于IO口模式配置的问题,通常情况下作为输出口都是默认推挽输出,比如第一个跑马灯实验,但是如果PWM输出你用最小系统板(本人用C8T6)没法映射到某个端口,需要外接杜邦线连接IO口和PWM输出口,此时IO口应该设置为浮空才有输入。具体参考手册对应芯片的引脚图和中文手册
3.注意IO口作为外设使用需要开启复用
4.外部中断的问题,51和stm32区别还是挺大的。我的PWM调整是通过按键进中断实现的,调整按键记得修改中断源和中断服务线。
不再一一列举,犯过类似错误的应该都懂。
效果图
灯闪烁的问题后来发现是定时器分频系数太大,频率偏低,改一下效果挺不错。(图为改之前)
代码
#include "delay.h"
#include "sys.h"
#include "led.h"
#include "key.h"
#include "pwm.h"
#include "exit_x.h"
#include "lcd_init.h"
#include "lcd.h"
#include "pic.h"
u16 speed = 500;
int main(void)
{
// u16 led0pwmval=0;
// u8 dir=1;
delay_init();
LED_Init();
KEY_Init();
Exit_Init();
LCD_Init();//LCD初始化
SysTick_CLKSourceConfig(1000);
LCD_Fill(0,0,LCD_W,LCD_H,BLACK);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
PWM4_Init(999,7199); //不分频。PWM频率=72000000/900=80Khz 72000000/7200=10Khz 1000/10K=0.1s
while(1)
{
delay_ms(10);
// if(dir)led0pwmval++;
// else led0pwmval--;
// if(led0pwmval>speed)dir=0;
// if(led0pwmval==0)dir=1;
TIM_SetCompare1(TIM4,speed);
LCD_ShowChinese(0,0,"调速监控显示",WHITE,BLACK,16,0);
LCD_ShowString(0,30,"SPEED:",WHITE,BLACK,16,0);
LCD_ShowIntNum(48,30,speed/10,3,WHITE,BLACK,16);
LCD_ShowPicture(65,80,40,40,gImage_1);
}
}
有需要的自取或评论留下邮箱(可能回复会慢)。
欢迎批评指正,共同进步!