999-project

smallcracker 2021-03-28 00:00:00
Categories: Tags:

简介

在ti的开发过程中,我常将所有外设的配置以及程序功能的实现全部放在main.c里,随着功能的增加,代码长度也在增加,最终导入一个模板代码就已经将近两百行,为代码的编辑带来很大不便。最近转到stm32上来后,了解到正点原子的项目架构,觉得这样的常见功能封装成库的思路很有益处,因此我采集了正点原子例程中一些调试常用功能,加入一些改造和整合,得到了这样一个模板库:BASIC.h

使用简介

创建目录时将BASIC文件夹复制到项目文件夹中,在keil的项目group里加入BASIC里个各个.c文件,在options for target里的c/c++选项include栏目里加入BASIC文件夹即可开始使用。

使用这个项目只需引用BASIC.h库即可,其他所有库均在这个库里面

功能介绍

延时函数

这部分内容由nxs7提供

函数原型:void Wait(u32 time)//time <= 1864

功能:让程序延时time ms

使能中断

这部分内容由正点原子提供,直接操作寄存器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//设置NVIC 
//NVIC_PreemptionPriority:抢占优先级
//NVIC_SubPriority :响应优先级
//NVIC_Channel :中断编号
//NVIC_Group :中断分组 0~4
//注意优先级不能超过设定的组的范围!否则会有意想不到的错误
//组划分:
//组0:0位抢占优先级,4位响应优先级
//组1:1位抢占优先级,3位响应优先级
//组2:2位抢占优先级,2位响应优先级
//组3:3位抢占优先级,1位响应优先级
//组4:4位抢占优先级,0位响应优先级
//NVIC_SubPriority和NVIC_PreemptionPriority的原则是,数值越小,越优先
void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group)
{
u32 temp;
MY_NVIC_PriorityGroupConfig(NVIC_Group);//设置分组
temp=NVIC_PreemptionPriority<<(4-NVIC_Group);
temp|=NVIC_SubPriority&(0x0f>>NVIC_Group);
temp&=0xf; //取低四位
NVIC->ISER[NVIC_Channel/32]|=(1<<NVIC_Channel%32);//使能中断位(要清除的话,相反操作就OK)
NVIC->IP[NVIC_Channel]|=temp<<4; //设置响应优先级和抢断优先级
}

这个函数用起来非常方便,比如,我们想为TIM3注册一个TIM3_IRQn中断的话,只需使用MY_NVIC_Init(0,3,TIM3_IRQn,2);即可,无需使用中断初始化结构体。

按键

初始化函数:void KEY_init(void)

在这个库中,我们借助TIM3,实现了KEY0,KEY1和WK_UP 的短按,长按和组合使用的功能,默认为输出操作信息。欲修改按键功能请到KEY.c文件中修改相关部分。

LED

初始化函数: void LED_init(void)

之后点灯的操作非常简单,比如 LED0 = 1;就是让第一个灯亮

USART

初始化函数:

1
2
3
4
//初始化IO 串口1
//pclk2:PCLK2时钟频率(Mhz)
//bound:波特率
void USART_init(u32 pclk2,u32 bound)

之后只需使用printf()即可通过串口输出信息。具备完整的printf功能。(这里就要比ti强很多)

此外,还提供通过串口的信息接收功能。默认功能是将受到的信息原样发出,通过修改USART.c中的analyseMessage()函数可以实现任意解析接收受到的输出。