stm32F4编码器测速并通过串口打印--- 程序源码

本文介绍了如何使用STM32F4通过编码器测速,并利用串口打印数据。首先,通过cubeMX配置端口、时钟、串口和定时器资源。在端口配置中,由于cubeMX没有编码器模式,选择了Input Capture direct mode。接着,配置了定时器中断,以便在计数溢出时记录数据。最终,展示了修改后的定时器初始化和主函数代码。
摘要由CSDN通过智能技术生成

一、使用cubeMX软件对程序需要使用的端口和资源进行初始化。
为了保持程序的简洁性,这里仅使用一个串口和一路通用定时器。
(1)引脚的初始化


注:在引脚配置这里,是没有编码器模式的,不知道为什么。高级寄存器是由combined channels选项的。
这里先暂时选择为Input Capture direct mode,后面在针对具体的代码进行修改即可。
(2)时钟的配置



(3)串口资源的配置




(4)定时器的配置



(5)中断的配置
这里不适用串口来接收数据,所以串口的中断也不用打开。这里需要打开定时器的中断,在定时器发生上下计数溢出时,需要对进行记录,保证记录的准确性。

(6)最后生成的定时器初始化代码如下:

static void MX_TIM3_Init(void)
{

  TIM_ClockConfigTypeDef sClockSourceConfig;
  TIM_MasterConfigTypeDef sMasterConfig;
  TIM_IC_InitTypeDef sConfigIC;

  htim3.Instance = TIM3;
  htim3.Init.Prescaler = 0;
  htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim3.Init.Period = 65535;
  htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  if (HAL_TIM_Base_Init(&htim3) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

  if (HAL_TIM_IC_Init(&htim3) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

  sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING;
  sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
  sConfigIC.ICPres
基本串口设置 串口设置:选择使用的串口号,可以通过“查找” 按钮自动查询当前系统可用串口。 波特率设置:输入将要使用波特率。 检验位设置:O=ODD=奇校验,E=EVEN=偶检验,N=无校验 10/16进制选择:当勾选后,接收缓冲区将以16进制数据格式显示,发送缓冲区数据必须是16进制格式,点击“发送”按钮时,将以16进制格式发送。否则(未勾选时),将以发送缓冲区将ASCII码的形式显示,点击“发送”按钮时,将以ASCII码直接发送。 打开串口:按配置打开相应串口,同时使能其他可能使用串口的按钮,再次点击则失能其他可能使用串口的按钮(如果未打开串口点击串口发送相关按钮会出现异常,另,修改串口基本设置后需要重新打开串口一次才会生效)。 帮助:即打开本文档 其他:略 简单通讯协议 界面操作说明 本协议将每帧数据数据分为帧头H,帧长L,参数P,数据D,校验C,帧尾E这6大部分,其中每个字段是否使用和使用的字节长度均可以选择或设置。帧格式设定: 帧头H字段:以16进制直接写入,软件自动计算帧头所占字节数,将存入变量H1、H2、H3……的格式中。 帧长L字段:以16进制直接写入,设置帧长所占字节,然后软件自动计算帧长,并将存入变量L1、L2、L3……的格式中。 参数P字段:以16进制直接写入,软件自动计算参数所占字节数,将存入变量P1、P2、P3……格式中。 数据D字段:这里只选择数据所占的字节数,数据的内容在后面的Dt框中填入,并将数据存入到变量Dt中。 校验C字段:这里只选择校验所占的字节数,校验的方式按后面的公式计算而来。C1、C2、C3…… 帧尾E字段:以16进制直接写入,软件自动计算帧尾所占字节数,将存入变量E1、E2、E3……格式中。 公式说明的使用方法 变量:上述字段中的H1、H2、H3……、L1、L2、L3……、P1、P2、P3……、Dt、C1、C2、C3……、E1、E2、E3……即为公式的变量名称; 立即数:操作立即数以2位16进制数,立即数中的字母必须小写。 操作符:目前只支持+(加)、-(减)、*(乘)、/(除)、&(与)、|(或)、~(非)、^(异或)、@(循环)操作,其中~(非)操作的前面变量或立即数无效; 结果变量:公式的结果存入到F1、F2、F3……变量中,同时可以供下一个公式可以使用; 结束符:整个公式以’;’号结尾,最后一次使用的结果变量将成为最终的运算结果投入到串口帧的使用; 注意: 操作符与结束符占1字节,其余均为2字节,整个公式必须有9字节并严格按照格式进行输入,否则软件无法正确识别; 变量名必须大写,16进制数必须小写,变量名只支持上述字段中的名称且序号不得超过10个,否则会出错; 中间不能插入空格; 举例:比如,在Dt字符框中输入100; 执行F1=Dt+00;F2=F1+00;表示F1=100;F2=100;最后输出F2的值100。 执行F1=Dt+10;F2=F1+20;表示F1=116;F2=148;最后输出F2的值148。 执行F1=Dt*10;F2=F1+00;表示F1=116;F2=148;最后输出F2的值148。 执行F1=Dt+00;F2=F1*0a;F1=01@F2;表示从F1开始按步进01循环发数据到F2为止,即for(i=100;i<1000;i+=1)类似的循环,发送的数据=i;循环操作目前还有待完善,不建议使用。 校验公式与此是一样的操作,但@后表示选择程序集成的特殊协议如Modbus协议。 @01表示Modbus协议,代码略 @02表示CRC-CTII协议,代码如下: U16 Crc16_B(u8 *puchMsg, u16 usDataLen){ U8 aCRCHi[256]= {0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,……,0xC1,0x81,0x40}; U8 aCRCLo[256] ={0x00,0xC0,0xC1,0x01,0xC3,0x03,0x02,0xC2,0xC6,0x06,……,0x81,0x80,0x40}; U8 uIndex,uchCRCHi=0xff,uchCRCLo=0xff; while(usDataLen--){ uIndex=uchCRCHi^*puchMsg++; uchCRCHi=uchCRCLo^aCRCHi[uIndex]; uchCRCLo=aCRCLo[uIndex]; } return (uchCRCHi<<8|uchCRCLo); } @03~FF保留未使用 Setting.ini配置文件 不同的使用者可能会对协议作频繁的改动,为了减少许多重复工作量,所以在左边设计了下拉菜单,选择经常使用的通讯协议配置,但即使
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值