历史上的今天
今天是:2024年12月29日(星期日)
2018年12月29日 | STM32 HAL库 定时中断和编码输入
2018-12-29 来源:eefocus
这些基础的东西看视频很费时间而且有过基础的在学习只是库不太清楚,希望我总结的库使用的一些使用能节约一点大家的时间。
void TIM3_Init(u16 arr,u16 psc)
{
TIM3_Handler.Instance=TIM3; //通用定时器3
TIM3_Handler.Init.Prescaler=psc; //分频系数
TIM3_Handler.Init.CounterMode=TIM_COUNTERMODE_UP; //向上计数器
TIM3_Handler.Init.Period=arr; //自动装载值
TIM3_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;//时钟分频因子
HAL_TIM_Base_Init(&TIM3_Handler);
HAL_TIM_Base_Start_IT(&TIM3_Handler); //使能定时器3和定时器3更新中断:TIM_IT_UPDATE
}
HAL库的特点就是有很多结构体嵌套这样一个句柄就可以配置所有的函数非常方便。
就在HAL_TIM_Base_Init(&TIM3_Handler);函数中有调用 HAL_TIM_Base_MspInit(htim);函数在这个函数里配置NVIC中断优先级配置。
进入中断配置我们都不需要配置只要在回调函数中写上我们想执行的函数就可以了,超级简单而且只要搞清楚回调函数这个函数实际上就类似于我们配置判断中断产生后执行只是把我们想执行的东西放到一个函数调用中实现。非常简洁
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{
if(htim->Instance==TIM3)
{
__HAL_RCC_TIM3_CLK_ENABLE(); //使能TIM3时钟
HAL_NVIC_SetPriority(TIM3_IRQn,1,3); //设置中断优先级,抢占优先级1,子优先级3
HAL_NVIC_EnableIRQ(TIM3_IRQn); //开启ITM3中断
}
}
//定时器3中断服务函数
void TIM3_IRQHandler(void)
{
HAL_TIM_IRQHandler(&TIM3_Handler);
}
回调函数,定时器中断服务函数调用
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim==(&TIM3_Handler))
{
LED1=!LED1; //LED1反转
}
}
理解了我们就看通用定时器很常用的两个功能 (我一般就是PWM 控制电机和编码器反馈转速这两个功能,个人个感觉很实用自己写个函数测试一下)
编码器我整整调了三天,以前没有自己写过直接拿来用,现在自己写发现自己不了解的太多了TIM_HandleTypeDef
TIM4_Handler; //定时器4句柄
TIM_Encoder_InitTypeDef TIM4_Encoder_Handler;
//定时器4通道1输入捕获配置
//arr:自动重装值(TIM2,TIM4是16位的!!)
//psc:时钟预分频数
void TIM4_Encoder_Configration(u16 arr,u16 psc)
{
TIM4_Handler.Instance=TIM4;
TIM4_Handler.Init.Prescaler=0; //分频系数
TIM4_Handler.Init.CounterMode=TIM_COUNTERMODE_UP; //向上计数器
TIM4_Handler.Init.Period=65535; //自动装载值
TIM4_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;//时钟分频银子
//HAL_TIM_Base_Init(&TIM4_Handler);//HAL_TIM_OC_Init(&TIM4_Handler);
TIM4_Encoder_Handler.EncoderMode=TIM_ENCODERMODE_TI12;
TIM4_Encoder_Handler.IC1Filter=0;
TIM4_Encoder_Handler.IC1Polarity=TIM_ICPOLARITY_RISING;
TIM4_Encoder_Handler.IC1Prescaler=TIM_ICPSC_DIV1;
TIM4_Encoder_Handler.IC1Selection=TIM_ICSELECTION_DIRECTTI;
TIM4_Encoder_Handler.IC2Filter=0;
TIM4_Encoder_Handler.IC2Polarity=TIM_ICPOLARITY_RISING;
TIM4_Encoder_Handler.IC2Selection=TIM_ICSELECTION_DIRECTTI;
TIM4_Encoder_Handler.IC2Prescaler=TIM_ICPSC_DIV1;
HAL_TIM_Encoder_Init(&TIM4_Handler,&TIM4_Encoder_Handler);
HAL_TIM_Encoder_Start(&TIM4_Handler,TIM_CHANNEL_ALL);
HAL_TIM_Encoder_Start_IT(&TIM4_Handler,TIM_CHANNEL_ALL);//开启中断
TIM4->CNT=0;
__HAL_TIM_ENABLE_IT(&TIM4_Handler,TIM_IT_UPDATE); //使能更新中断一定要使能这一句话困扰了我两天
//__HAL_TIM_ENABLE(&TIM4_Handler);
}
void HAL_TIM_Encoder_MspInit(TIM_HandleTypeDef *htim)
{
GPIO_InitTypeDef GPIO_Initure;
if(htim->Instance==TIM4)
{
__HAL_RCC_GPIOD_CLK_ENABLE(); //开启GPIOA时钟
__HAL_RCC_TIM4_CLK_ENABLE(); //使能TIM3时钟
GPIO_Initure.Pin=GPIO_PIN_12|GPIO_PIN_13; //PA0
GPIO_Initure.Mode=GPIO_MODE_AF_PP; //输入
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Alternate=GPIO_AF2_TIM4; //PA0复用为TIM4通道1
HAL_GPIO_Init(GPIOD,&GPIO_Initure);
//// HAL_NVIC_SetPriority(TIM4_IRQn,2,0); //设置中断优先级,抢占优先级2,子优先级0
//// HAL_NVIC_EnableIRQ(TIM4_IRQn); //开启ITM4中断通道
//ARPE使能
TIM4->CNT=0;
//TIM4->CNT = 0;
// __HAL_RCC_TIM4_CLK_ENABLE();//配置定时器四开启
}
}
史海拾趣
|
dxp sp2 中为什么在禁止布线层画边框范围时总是自己跳层 protel dxp sp2 中为什么在禁止布线层画边框范围时总是自己跳层??只要一开始画边框他就会自己跳到布线层,愁死了,新装的dxp sp2 :\'( 第一次碰到这种情况,郁闷啊,大家帮帮忙!!… 查看全部问答> |
|
Pretous中LPC2138 P1口接1602液晶 仿真无法显示!! 本人在搭个Proteus中的虚拟仿真平台,用到LM1602时,无法正常显示发送的数据,相同的代码本人在LPC2106的P0口中曾成功过,因为外接部件多所以选用了LPC2138的P1,单步调试时写操作数都是正确的但是数据写入到IOSET1中就是无法显示;本人最怕在仿真 ...… 查看全部问答> |
|
层被琐后Blt返回DDERR_SURFACEBUSY是由谁返回的? 请问执行Blt时有没有锁?如果有,加在哪里?跟到HalBlt里面没有加锁。层被琐时执行Blt操作直接返回DDERR_SURFACEBUSY,没有进HalBlt操作,错误码是由谁返回的?Blt和BltFast跟到底层都是执行的HalBlt,他们对硬件的依赖代码是否封在directDraw里面?… 查看全部问答> |
|
?以前没做过嵌入式开发,现两家公司招聘被录用,一家做手机,一家做电视? 哪家更好些? ?以前没做过嵌入式开发,现两家公司招聘被录用,一家做手机,一家做电视? 哪家更好些? 因为两家公司实力相当,我没有办法比较。 以前做研发只用vc开发过项目,对嵌入式并不了解。 所以,想问问各位: 做软件, 开发手机和开发电视 ,哪个前 ...… 查看全部问答> |
|
OEMStartDoc( SURFOBJ *pso, PWSTR pwszDocName, DWORD dwJobId) { TERSE(UNITEXT(\"OEMStartDoc ...… 查看全部问答> |
|
在vxsim仿真环境中用到 POSIX中的函数,如何包含INCLUDE_POSIX_SCHED,不选bsp建立的工程(downloadable)的工程是不是都不能选组件配置?有什么其他方法么?谢谢。 ps:问题得到解决怎么揭帖?… 查看全部问答> |
|
本帖最后由 jameswangsynnex 于 2015-3-3 19:59 编辑 安装lunux环境 安装编译工具 下载Linux kernel 安装Android SDK 获得root file system 修改Linux kernel源码 配置Linux kernel 修改root file system 编译Linux kernel 下载 ...… 查看全部问答> |
|
【设计工具】文档介绍了使用ISE10.1进行某种功能的FPGA操作步骤 文档介绍了使用ISE10.1进行某种功能的FPGA操作步骤,包括从新建文档、综合、功能仿真、编译实现和插入IP核等步骤,讲解非常详细。 … 查看全部问答> |




