【硬石STM32f407开发板_DIY入门】模块化编程实例

1. 项目需求

定时6定时通过串口6发送一个数组,带CRC校验,参考如下
0x01,0x02,0x03,crc_h,crc_l,
baudrate=9600bps。
CPU:stm32f407vg

2. 开发环境

硬件平台:硬石STM32f407开发板
在IAR环境下使用cubeMX辅助生成初始化代码

3. 要求

  1. 把CRC校验部分使用模块化编程的思路和main.c分开。在一个main.c中写程序写惯了,所以不管三七二十一,把所有代码都放在一起。现在都分开。
  2. 顺便把在it中编写IRQHandler函数,而不用放在main.c中的问题一起解决。

4. 实现步骤

4.1. 新建文件夹

4.2. 配置时钟树

配置时钟树

4.3. 配置定时器

配置定时器

4.4. 配置RCC

4.5. 配置串口

配置串口

4.6. 配置NVIC

配置NVIC
代码生成

4.7. 生成工程

5. 工程创建之后

5.1新建文件与文件夹

在文件夹中新建一个自己的文件夹存储c文件和h文件,先建立一个母文件夹UserDefineFilename,然后在文件夹中建一个source文件夹和header文件夹。

5.2在开发环境中新增头文件的存储路径

5.3 编辑代码

在it.c中增加变量定义

/* USER CODE BEGIN 0 */
#include "stdbool.h"/*一定要在cubeMX生成的user code 用户代码中添加代码*/
unsigned int tim6_cnt;/*定时器6计时变量*/
extern bool tim6_flag;/*定时时间到*/

/* USER CODE END 0 */

在main.c中增加

/* USER CODE BEGIN Includes */
#include "stdbool.h"
#include "CRC.h"
bool tim6_flag;/*定时时间到*/
unsigned char tx6[5]={0x01,0x02,0x03};
/* USER CODE END Includes */

编辑定时器6全局中断中的代码

/**
* @brief This function handles TIM6 global interrupt, DAC1 and DAC2 underrun error interrupts.
*/
void TIM6_DAC_IRQHandler(void)
{
  /* USER CODE BEGIN TIM6_DAC_IRQn 0 */

  /* USER CODE END TIM6_DAC_IRQn 0 */
  HAL_TIM_IRQHandler(&htim6);
  /* USER CODE BEGIN TIM6_DAC_IRQn 1 */
  tim6_cnt++;
  if(tim6_cnt==1000)
  {
    tim6_cnt=0;
    tim6_flag=1;
  }
  /* USER CODE END TIM6_DAC_IRQn 1 */
}

在工程中新增group,大家喜欢命名为bsp(板级支持代码)

添加代码文件

新建c文件,并添加代码,此文件保存在之前定义的source文件夹中,并将此c文件添加到bsp中

#include "CRC.h"
extern void Calculate_CRC(unsigned char *P,unsigned char  MessageLenth)/*别忘了extern*/
{
  unsigned char Carry,n;
  CRC_L=0xff;
  CRC_H=0xff;
  while(MessageLenth--)
  {
    CRC_L=CRC_L^(*P);
    for(n=0;n<8;n++)
    {
      Carry=CRC_L&1;
      CRC_L>>=1;
      
      if(CRC_H & 0x01) 
        CRC_L=CRC_L|0x80;     
      CRC_H>>=1;
      if(Carry)
      {
        CRC_L^=0x01;
        CRC_H^=0xa0;
      }
    }
    P++;
  }
  return;
}

新建h文件,并添加代码,此文件保存在之前定义的header文件夹中

#ifndef __CRC_H
#define __CRC_H
extern  unsigned char   CRC_L,CRC_H;//串口6接收,因为外部要使用,所以前面加extern

extern void Calculate_CRC(unsigned char *P,unsigned char  MessageLenth);// ,因为外部要使用,所以前面加extern
#endif /* __CRC_H */

增加所有新增h文件的存储路径

增加所有新增h文件的存储路径,这里就一个。
新增h文件的存储路径

在main.c中增加

/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
unsigned char   CRC_L,CRC_H;/*it里面有了,但是这里还要说一下*/
/* USER CODE END PV */

在while(1)之前打开中断

/* USER CODE BEGIN 2 */
  HAL_TIM_Base_Start_IT(&htim6);//打开定时器6中断
  /* USER CODE END 2 */

在while(1)中增加

if(tim6_flag)
    {
      tim6_flag=0;
      Calculate_CRC(tx6,3);
      tx6[3]=CRC_H;
      tx6[4]=CRC_L;
      HAL_UART_Transmit(&huart6,tx6,5, 0xffff);
}

6.验证结果

打开串口调试助手监视

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值