前言:
之前是用stm32cube建立工程,也没体会到臃肿,然而现在使用寄存器开发,真正感觉快太多了,整个工程特别清爽~一共也没几个文件,几乎只需要启动文件(.s那个汇编文件),还有正点原子给的时钟、串口初始化文件就差不多够了,编译速度简直不要太快~
想起之前做一些单片机小项目经常要用到的就是滴答定时器,1ms中断一次,可以用来计时计数,指示程序运行状态之类的,很好用,但是正点原子的delay相关的函数就是用这个来实现的,占用了滴答定时器,所以我就想着用寄存器编程来达到1ms中断一次,实现中断服务程序备用这样一个目的。下面是原理和代码:
我一般的编程习惯是1.写出思路2.填充要配置的寄存器到思路里3.写代码
原理代码:
对滴答定时器的编程要看网络资料或者官方资料,下面是官方资料说的
在《STM32F3与F4系列Cortex M4内核编程手册.pdf》的234页,有这样一个章节
翻译过来就是滴答定时器的编程步骤是:
1.写重装载值2.清除当前的计数值 3.设置控制和状态寄存器
寄存器就不看手册的太费劲了,正点原子开发指南有给。一共四个寄存器,有一个没用的没放出来。
下面是结合寄存器的编程步骤:
1.写重装载值
由于我时钟的主频是168M,所以要1ms中断一次,这个重装值= 1ms / (1/168M)= 168M/1000
这个计算算是比较常见的应该不用解释,所以是:
SysTick->LOAD = 168000-1
2.清除当前的计数值
SysTick->VAL = 0;
3.设置控制和状态寄存器
配置不分频(bit2置1),配置计数到0产生异常请求(bit1置1),使能滴答定时器(bit0置0)
SysTick->CTRL = (1<<2|1<<1|1<<0)
其实上述配置,内核头文件有相关函数:SysTick_Config
只需要调用
SysTick_Config(168000);//参数是重装值值,配置1ms中断一次
即可完成上面的所有操作,我估计内核外设应该厂家都写好了。
滴答定时器部分写完,还有中断相关的呢,无非就是两个步骤:
1.设置NVIC分组方式2.设置滴答定时器中断优先级3.找到对应的中断函数名实现出来
分别如下:
NVIC_SetPriorityGrouping(2);
NVIC_EnableIRQ(SysTick_IRQn);
设置中断优先级这个部分,SysTick_Config里已经实现了,当然再写一次也无妨。
下面这个是滴答定时器中断服务函数,好像没有什么标志位需要清除的,直接用,实测ok
void SysTick_Handler(void)
{
//中断逻辑
}
效果如下:
还是挺准的
完整代码如下:
u16 myconut;
//systick中断服务函数
void SysTick_Handler(void)
{
myconut++;
if(myconut>=1000){
myconut=0;
printf("hello\r\n");
}
}
int main(void)
{
u8 t=0;
Stm32_Clock_Init(336,8,2,7);//设置时钟,168Mhz
delay_init(168); //初始化延时函数
NVIC_SetPriorityGrouping(2);
SysTick_Config(168000);//1ms中断一次
NVIC_EnableIRQ(SysTick_IRQn);
uart_init(84,115200); //串口初始化为115200
while(1)
{
}
}