我就喜欢用寄存器操作 , 敲代码很爽很爽~~!! 工作中为方便查阅 , 把各个外设整理成了表格 .
- 寄存器完整Excel : STM32F429之寄存器表
- 寄存器工程模板 : 完整工作模板
- 10.1寸_真实工作代码 : STM32 LTDC 汉字输出
SYSTICK 主要作用:
- 大多时候用于做 延时函数, 下面有完整代码~
- STM系芯片基本都有systick, 因此也常用于为嵌入式系统产生时基;
- 很简单的, 只有4个寄存器,使用时只要控制前 3个:
- CTRL __ 控制及状态
- LOAD__ 重装载数值
- VAL ____ 当前计数值
- CALIB — 校准数值 (基本不用)
完整代码:
#include "Delay.h"
static float us=0;
static u16 ms=0;
/******************************************************************************
* Function Delay_init
* Description 延时函数 初始化
* Input art_1 <u8 HCLK> 系统时钟频率,如180MHz ,则参数为:180
**/
void Delay_Init(u8 HCLK)
{
SysTick->CTRL &= ~(1<<2); // 至0,值:HCLK/8,
us = (float)HCLK / 8; // 180MHz, 1us = 22.5 个脉冲 ,原子例程中,使用u8类型,180/8,无法除尽,使计时不准确,改为float
ms = ((u32)HCLK * 1000) / 8; // 180MHz, 1ms = 22500 次脉冲
DebugPrint ("Delay 配置完成\n");
}
/******************************************************************************
* Function Delay_us
* Description 微秒延时 ( 1us=22.5次)
* Input art_1 <u32 nus> 180MHz时,参数必须<745'654 ,2^24 / 180'000'000 / 8 / 1000 /1000
**/
void Delay_us(u32 nus)
{
u32 temp;
if(nus==0) return; // nus = 0 , 直接退出
SysTick->LOAD = nus * us; // 写入重装载值 ,延时值
SysTick->VAL = 0x00; // 清0计数器
SysTick->CTRL = 1; // 使能
do
{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16))); //等待时间到达
SysTick->CTRL = 0x00; // 停止计数器
SysTick->VAL = 0x00; // 清空计数器
}
/******************************************************************************
* Function Delay_xms
* Description 毫秒延时 _ 作基础函数被调用---由于SysTick->Val是24位,单次计时最大745毫秒,不方便
* Input art_1 <u32 xnms> 参数最大值 < 745 , ,24位最大值 / 180'000'000 / 8 / 1000
**/
void Delay_xms(u16 xnms)
{
u32 temp;
if(xnms==0) return; // nus = 0 , 直接退出
SysTick->LOAD = xnms*ms; // 时间脉冲值加载, LOAD 为24位
SysTick->VAL = 0x00; // 清空计数器
SysTick->CTRL = 0x01; // 使能,开始
do
{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16))); //等待时间到达
SysTick->CTRL = 0x00; // 关闭计数器
SysTick->VAL = 0x00; // 清空计数器
}
/******************************************************************************
* Function Delay_nms
* Description 毫秒延时
* Input art_1 <u16 nms> 0 ~ 65535
**/
void Delay_ms(u16 nms)
{
uint8_t repeat = nms / 500; // 计算次数,每500ms一次,
uint16_t remain = nms % 500; // 余下的毫秒数
while(repeat)
{
Delay_xms (500);
repeat--;
}
Delay_xms (remain);
}
希望使用寄存器的你也喜欢!~~