STM32学习踩坑实录
<1>LCD初始化中调用了printf’函数,如果不对串口进行初始化将会导致程序卡死。
<2>在LCD初始化之后,按键外部中断失效,但是LCD不进行初始化时中断可以正常工作。
解决方法:将LCD的初始化放在外部中断初始化的后面解决。
一般情况下将LCD,PWM等的初始化放在最后可以避免外部中断失效,同样的情况也会出现在PWM初始化和外部中断初始化的顺序上。
<3>设备STM32C8T6,在使用按键引脚PB3时无法正常使用。最终发现PB3引脚是作为JTAG下载接口使用,即使是初始化为输入模式也依然默认作为下载接口。
解决方法:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB
|RCC_APB2Periph_AFIO,ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
//GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST,ENABLE);
将PB3重映射并且失能JTAG功能即可。
<4>TIM3的ARR寄存器和PSC寄存器,确定PWM频率。
CCRx : 决定PWM占空比(高低电平所占整个周期比例),占空比的最大值为ARR寄存器的值。
IC以为输入捕获,OC以为输出比较。
1,使能定时器3和相关IO时钟(LED-PB5)
使能定时器3时钟:RCC_APB1PeriphClockCmd();
使能GPIOB时钟:RCC_APB2PeriphClockCmd();
2,初始化IO口为复用功能输出 GPIO_Init();
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
3,PB5输出PWM(定时器3通道2),需要部分冲突映射
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//开启AFIO时钟设置
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);//部分重映射
4,初始化定时器 (重装载值ARR,与分频系数PSC等)
TIM_TimeBaseInit();//决定PWM周期
5,初始化输出比较参数:
TIM_OC2Init();//通道2输出比较初始化
6,使能预装载寄存器
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);//定时器3 通道2
7,使能定时器
TIM_Cmd();
8,不断改变比较值CCRx,达到不同的占空比效果
TIM_SetCompare2(); //通道2,改变比较值CCRx
<5>
在keil软件中Flash->Configure Falsh Tools>Utilities>Setting>Flash download setup>Add Flash Programming Algorlthm"窗口中找不到STM32F10X 128kB Flash"
A:在keil安装目录…:\ProgramFiles\keil5\ARM\Pack\Keil\STM32F1xx_DFP\1.0.5\Flash中复制文件STM32F10x_128.FLM到路径F:\Program Files\keil5\ARM\Flash中即可正常添加