1.在主函数的正式调用里,RCC的配置一定要在各外设的函数调用之前。
2.外设调试出现问题时,一定先考虑是不是没有打开外设的时钟。并且RCC配置和外设时钟的打开要在配置寄存器之前。
3.使用模块化编程可以使程序简单易读,可移植性高,下一次调用方便。但是可能会出现很多问题,必须一一克服。 在主函数里,把需要用得到的各模块配置函数调用写入,这一点很重要。
4.模块化编程时,一定要确保模块的.c文件添加进了工程目录,否则会出现:Undefined Symbol的错误提示,这一点要牢记。
5.中断服务函数必须要写进stm32f10x.it.c里面。否则会出问题。
6.有时添加的模块太多可能会调试不出来,这时考虑把GPIO的端口复用AFIO打开。
7.外部中断的应用:
(1).EXTI的GPIO外部线路中断设置;
(2).EXTI初始化配置;
(3).中断服务函数里的写法:(如EXTI_9_5之类)尽量单元间 各自用各自的if和else if。
互相的单元间不要用else if连接。
( 4 ).中断服务函数里第一步就要清除中断标志位。
8.初始化外设如果在循环里面,比如PWM配置:
while(1)
{ TIM_Config(); }
这个时候如果不加延迟语句,很可能会出错,加入延迟可以一定程度改善。
9.break语句是跳出里的最近的循环体。但是要注意,if不属于循环体。所以一个while(1)里面只有if,一个break就让全盘跳出while(1)!
10. while(1)
{
if(!Front_LDR_Signal)
{
if(a==1)
{}
else
{
a=1;
b=0;
drive(700,0,700,0);
Delayms(80);
}
}
if(Front_LDR_Signal)
{
if(b==1)
{}
if(b==0)
{
a=0;
b=1;
drive(700,0,0,0);
Delayms(80);
}
}
用if双层判断语句可以很好地避免每一次循环都要重新配置PWM,节约CPU。这个用法很好。
11.外部中断函数不能进入的原因分析:
1)GPIO或者AFIO的时钟没有开启;
2)GPIO和配置的中断线路不匹配;
3)中断触发方式和实际不相符合;
4)中断处理函数用库函数时,写错,经常可能出现数字和字母之间没有下划线;
5)外部中断是沿触发,有可能不能检测到沿,比如 中断线是低电平(浮空输入),触发是下降沿触发,可能会出现一直是低电平,高电平的时候是一样的情况,电平持续为高电平;
6)没有用软件中断来触发外部中断,调用函数EXTI_GenerateSWInterrupt;,因为软件中断先于边沿中断处理。
12.中断NVIC的配置(尤其是其中的NVIC_InitStructure.NVIC_IRQChannel = EXTIx_IRQn;),绝对不可以占用输出等功能的GPIO口通道。比如配置了NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn; 那么PX2输出PWM就会出现不可预知的问题。