鸽了有小半年,前段时间一直忙于项目上的事情,离职与找工作的一系列事情,目前工作已找到,稳定下来了,有更多的时间专注学习,继续提升自己。
工作三年硬件软件都做过,目前职业规划是深耕于嵌入式软件,兼顾学习嵌入式硬件,最后独立开发项目,目前个人水平自认为勉强算是个初级软硬件工程师吧,找工作时由于硬件软件都不精,只能拿个入门工资,现在找准一个深耕下去,目前十年规划是成为高级嵌入式软件工程师,工资十年月入2W目标,继续努力!
在新公司有半个月了,感觉各方面都不错,新公司负责的第一个项目是CO2传感器,使用芯片型号STM32F051K8U6,之前一直用的是F1和F4型号,突然换芯片不适应,努力看了1周的芯片手册已经没问题了,各个功能模块已经调通,只剩下求取气体浓度的算法需要研究,加油!
写这篇文章算是对之前的一个总结与之后的工作部署!
新芯片的程序与之前用过的有很大区别,写这篇文章给大家一个参考
TIM定时器
定时器的作用这里不再叙述,说一下使用TIM定时器延时与systick定时器延时的区别:
定时器延时:打个比方,你正在烧水,突然手机铃声响了,你可以立即去接电话,等水烧开了在回来,这样的延时烧水和接电话两个都不耽误,可以同时进行
systick延时:你正在烧水,突然手机铃声响了,此时按照程序设定,你必须等水烧开了才能去接听电话,烧水和接听电话只能有一个在进行,不能同时执行
所以TIM延时要优于systick延时
TIM配置主要有NVIC配置和模式配置,模式配置要使能中断,最后在TIM3_IRQHandler中断函数
void TIM_NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPriority=1;
NVIC_Init(&NVIC_InitStructure);
}
void TIM_Mode_Config(void)
{
TIM_TimeBaseInitTypeDef TIM_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
TIM_InitStructure.TIM_Period = (1000-1);
TIM_InitStructure.TIM_Prescaler = (48-1);
TIM_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;//ʱÖÓ·ÖƵÒò×Ó
TIM_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;//¼ÆÊýģʽ
TIM_InitStructure.TIM_RepetitionCounter =0;//Öظ´¼ÆÊýÖµ£¬Ã»ÓÐÓõ½²»ÓùÜ
TIM_TimeBaseInit(TIM3,&TIM_InitStructure);
TIM_ClearFlag(TIM3,TIM_FLAG_Update);
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
TIM_Cmd(TIM3, ENABLE);
}
void TIM_Config(void)
{
TIM_NVIC_Config();
TIM_Mode_Config();
}
uint32_t gtime;
uint8_t Utime;
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
gtime++;
Utime++;
gtime100ms++;
if(gtime>=10000)
{
gtime =0;
}
if(Utime>=100)
{
Utime=0;
USART1_Send_Array_HalfWord(USART1, RegularConvData_Tab,3);//
// USART1_Send_Array_Byte(USART1,test,6);
}
}
}
PWM使用:
PWM概念这里也不再过多叙述,只讲下PWM最主要的几个点
1.PWM的周期
PWM周期由时钟频率,分频系数,计数周期决定
PWM周期=分频系数*计数周期/时钟频率
2.PWM占空比:
*占空比=TIM_Pulse 的值/(分频系数**计数周期)
```c
#include "PWM.H"
uint16_t TimerPeriod = 0;
uint16_t Channel1Pulse = 0;
void PWM_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* ʹÄÜGPIOʱÖÓ */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
/* ÅäÖÃGPIO¹Ü½Å¸´ÓÃ*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource3, GPIO_AF_2);
}
void PWM_Mode_Config(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TimerPeriod= 9999;
Channel1Pulse = (uint16_t) (((uint32_t) 5 * (TimerPeriod - 1)) / 10);
TIM_TimeBaseInitStructure.TIM_Period = TimerPeriod;
TIM_TimeBaseInitStructure.TIM_Prescaler = 7400-1;
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, & TIM_TimeBaseInitStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = Channel1Pulse;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC2Init(TIM2, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM2, ENABLE);
TIM_Cmd(TIM2, ENABLE);
// TIM_ITConfig(TIM2, TIM_IT_CC1, ENABLE);
// TIM_CtrlPWMOutputs(TIM2, ENABLE);
}
void PWM_Config(void)
{
PWM_GPIO_Config();
PWM_Mode_Config();
}