一、 STM32F103C8T6简介
CPU简介 STM32F103C8T6、CPU频率 72Mhz、RAM:20K FLASH:64K、通用/IO 32 、USART 3个、CAN 1个、IIC 2个、12位同步ADC 2组 10通道。
二、使用库函数点灯
2.1、GPIO配置
void GPIOxInit(uint32_t GPIOx_RCC,GPIO_TypeDef *GPIOxPORT,uint16_t GPIOPin,GPIOMode_TypeDef GPIOMode)
{
RCC_APB2PeriphClockCmd(GPIOx_RCC, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
/* Configure PD0 and PD2 in output pushpull mode */
GPIO_InitStructure.GPIO_Pin =GPIOPin;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIOMode;
GPIO_Init(GPIOxPORT, &GPIO_InitStructure);
}
初始化
void LEDInit(void)
{
GPIOxInit(LED_RCC,LED_PORT,LED_PIN,GPIO_Mode_Out_PP);
LED_H;
}
宏定义
#ifndef _LED_H
#define _LED_H
// LED PC13
#define LED_RCC RCC_APB2Periph_GPIOC
#define LED_PORT GPIOC
#define LED_PIN GPIO_Pin_13
// 拉高电平
#define LED_H GPIO_SetBits(LED_PORT,LED_PIN)
// 拉低电平
#define LED_L GPIO_ResetBits(LED_PORT,LED_PIN)
#endif
2.2、定时器配置
void TIMx_Config(TIM_TypeDef* TIMx)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructrue; // 定时器结构体
if(TIMx==TIM2)
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // 使能TIM2外设时钟
else if(TIMx==TIM3)
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
else if(TIMx==TIM4)
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
else if(TIMx==TIM5)
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);
uint16_t PrescalerValue = 0; // specifies the Prescaler Register value
// NVIC_Config(TIM2_IRQn,0x00,0x01);
PrescalerValue = (uint16_t) (72000000 / 12000000) -1; // TIM_TimeBaseStructrue.TIM_Prescaler = 5;
/*定时器计数频率 = 内部时钟源频率(APB1倍频器送出的时钟)/(TIM_Prescaler+1) = 36KHz/6 = 6MHz
计数周期T = ((per)*(psc+1))/定时器时钟频率 = 6000*6 /36KHz = 1000微妙 = 1ms
计数6000次用时1ms 产生1次中断TIM_IT_Update
*/
TIM_TimeBaseStructrue.TIM_Period = 6000; // 定时器周期 自动装载的值,每计数6000次,产生一个更新事件
/*预分频寄存器TIMx_PSC用于对计数器时钟频率进行分频,它是一个16位的寄存器
取值范围ox00 ~ 0xFFFF 转换为十进制 0 ~ 65535,分频系数时除数分母不能为0所以会自动加1,最后实现1~65536分频
*/
TIM_TimeBaseStructrue.TIM_Prescaler = 0; // 定时器预分频器
TIM_TimeBaseStructrue.TIM_ClockDivision = 0; // 时钟分频 0表示滤波器与定时器频率一样
TIM_TimeBaseStructrue.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数模式
TIM_TimeBaseInit(TIMx, &TIM_TimeBaseStructrue); // 将配置应用到TIM2
TIM_PrescalerConfig(TIMx, PrescalerValue, TIM_PSCReloadMode_Immediate); // 及时装入PrescalerValue的值
TIM_ITConfig(TIMx, TIM_IT_Update, ENABLE); // 配置TIM2中断类型,并使能
TIM_Cmd(TIMx, ENABLE); // 使能TIM2通用定时器
}
中断配置
/********************************************* 中断优先级配置*********************************************/
void NVIC_Config(st_u8 IRQn,st_u8 IRQChannelPriority,st_u8 IRQChannelSubPriority)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =IRQChannelPriority; // 抢占式优先级 0~15
NVIC_InitStructure.NVIC_IRQChannelSubPriority =IRQChannelSubPriority ; // 子优先级 0~15
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
初始化
// TIM2 1ms 中断定时器配置
void TIM2_Init(void)
{
//STM32F103C8T6_PERIPHERAL_CLOCK_Init(RCC_HCLK_Div4); // AHB=systemclock = 72M PCLK=72/4=18M
// HSE_SetSysClock(RCC_PLLMul_9);
NVIC_Config(TIM2_IRQn,0x00,0x01); // 中断优先级设置
TIMx_Config(TIM2);
}
中断服务函数
unsigned char T10ms;
unsigned char T100ms;
unsigned char T1s;
void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
T10ms++;
if(T10ms >= 10)
{
T10ms = 0;
T100ms++;
}
if(T100ms >= 10)
{
T100ms = 0;
TimerCount();
T1s++;
}
if(T1s >= 10)
{
T1s = 0;
}
}
}
延时
void TimerCount(void)
{
L_Timer++;
if(L_Timer>1000)L_Timer=0;
}
LED800ms闪灯一次
void LED_Test(void)
{
if(L_Timer%8==0)
{
LED_H;
}else{
LED_L;
}
}