打开官方的库函数综合例程,里面有4个文件夹,分别是User,APP,Driver,ISR。
User存放主函数 main,系统初始化 system_init 和分时任务调用 Task。
APP里存放了应用例程,我们可以直接在例程基础上改或者在APP文件夹新建我们自己的文件。
Driver存放了各硬件外设的驱动。
![Alt]
如上图,从入口main函数进去后,先调用system_init函数,把需要用到的硬件初始化后,在while循环运行任务调度函数Task_Pro_handler_Callback();用户程序就放在任务调度程序里。
系统时钟在config.h文件里,#define MAIN_Fosc 22118400L
//定义主时钟
void main(void)
{
SYS_Init();
while (1)
{
Task_Pro_Handler_Callback();
}
}
“system_init.c”文件里存放系统初始化函数 SYS_Init()
,执行全局初始化;
void SYS_Init(void)
{
GPIO_config();
Timer_config();
ADC_config();
UART_config();
Exti_config();
// I2C_config();
// SPI_config();
// CMP_config();
Switch_config();
EA = 1;
APP_config();
}
SYS_Init
提供了部分硬件的初始化程序,APP_config()
里面存放用户自己需要初始化的程序。
GPIO初始化,IO口有四种模式:准双向口(弱上拉),高阻输入,漏极开路,推挽输出。不配置的话除P3.0 P3.1外其余上电后全是高阻输入模式,使用前需要配置对应的引脚。
在这里除了配置输入输出模式外,还可以配置内部上拉电阻,Pn_PULL_UP_ENABLE(Pin)
可以使能内部4.1K上拉电阻。
void GPIO_config(void)
{
P0_MODE_IO_PU(GPIO_Pin_All); //P0 设置为准双向口
P1_MODE_IN_HIZ(GPIO_Pin_LOW); //P1.0~P1.3 设置为高阻输入
P1_MODE_OUT_OD(GPIO_Pin_4 | GPIO_Pin_5); //P1.4,P1.5 设置为漏极开路
P2_MODE_IO_PU(GPIO_Pin_All); //P2 设置为准双向口
P3_MODE_IO_PU(GPIO_Pin_LOW); //P3.0~P3.3 设置为准双向口
P3_MODE_IO_PU(GPIO_Pin_HIGH); //P3.4~P3.7 设置为准双向口
// P3_MODE_IN_HIZ(GPIO_Pin_6 | GPIO_Pin_7); //P3.6,P3.7 设置为高阻输入
P4_MODE_IO_PU(GPIO_Pin_0 | GPIO_Pin_6 | GPIO_Pin_7); //P4.0,P4.6,P4.7 设置为准双向口
P6_MODE_IO_PU(GPIO_Pin_All); //P6 设置为准双向口
P7_MODE_IO_PU(GPIO_Pin_All); //P7 设置为准双向口
P1_PULL_UP_ENABLE(GPIO_Pin_4 | GPIO_Pin_5); //P1.4,P1.5 开启内部上拉
}
Timer_config();
用来初始化定时器,共有5个定时器,这里初始化定时器0,产生1ms的中断,作为任务调度的基准时钟。
void Timer_config(void)
{
TIM_InitTypeDef TIM_InitStructure; //结构定义
TIM_InitStructure.TIM_Mode = TIM_16BitAutoReload; //指定工作模式, TIM_16BitAutoReload,TIM_16Bit,TIM_8BitAutoReload,TIM_16BitAutoReloadNoMask
TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_1T; //指定时钟源, TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext
TIM_InitStructure.TIM_ClkOut = DISABLE; //是否输出高速脉冲, ENABLE或DISABLE
TIM_InitStructure.TIM_Value = 65536UL - (MAIN_Fosc / 1000UL); //初值,
TIM_InitStructure.TIM_Run = ENABLE; //是否初始化后启动定时器, ENABLE或DISABLE
Timer_Inilize(Timer0,&TIM_InitStructure); //初始化Timer0 Timer0,Timer1,Timer2,Timer3,Timer4
NVIC_Timer0_Init(ENABLE,Priority_0); //中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
}
第一句中TIM_InitTypeDef
是结构体变量类型,这里可以省略struct 是因为定义的时候使用了typedef
:
链接: struct和typedef struct
使用typedef定义的结构体
typedef struct
{
u8 TIM_Mode; //工作模式, TIM_16BitAutoReload,TIM_16Bit,TIM_8BitAutoReload,TIM_16BitAutoReloadNoMask
u8 TIM_ClkSource; //时钟源 TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext
u8 TIM_ClkOut; //可编程时钟输出, ENABLE,DISABLE
u16 TIM_Value; //装载初值
u8 TIM_Run; //是否运行 ENABLE,DISABLE
} TIM_InitTypeDef;
使用TIM_InitTypeDef
定义出结构体变量TIM_InitStructure
,然后分别给TIM_InitStructure
成员赋值,
TIM_InitStructure.TIM_Mode = TIM_16BitAutoReload;
TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_1T;
TIM_InitStructure.TIM_ClkOut = DISABLE;
TIM_InitStructure.TIM_Value = 65536UL - (MAIN_Fosc / 1000UL);
TIM_InitStructure.TIM_Run = ENABLE;
赋值后使用定时器初始化函数Timer_Inilize(Timer0,&TIM_InitStructure);
初始化定时器0;