10.找到STM32cubeMx所建的工程目录,在工程目录的同级目录下新建一个文件夹用来存放自己写的代码

11.用notepad++打开keil的工程文件,在这里的<Group>前面加上

<Group>

<GroupName>刚才新建的文件夹的名字</GroupName>

</Group>

这样用keil打开工程文件,就可以看到一个以新建的文件夹的名字命名的文件组了

12.添加一个userLogic.c文件

里面引出两个函数

void vUserInit(void);//放在main.c的大while前面,用于用户代码初始化,要把TIM6开启的代码放里面

!!!注意,里面开头一定要delay 2s,用于同步mcu与外围电路的上电时间,

避免不必要的麻烦

void vUserWhile(void);//放在main.c的大while里面,用来跑用户自定义的函数,

vUserWhile()函数里面的风格是这样的,timerFlgData是一个里面都是TIM6的时间Flg的结构体

if(timerFlgData.ucMainRunFlg==1)
{
  vMainRun();
  timerFlgData.ucMainRunFlg=0;
}

13.添加一个userTimer.c文件,里面就是初始化定时器(包括TIM6),各种定时器的回调函数(里面包括设置timerFlgData里的标志位的功能),以及延时函数

//By__Tuosheng-ml
#include "userTimer.h"
#include "tim.h"const uc fac_us=48;//时钟多少MHZ,就改多少
struct TimerFlgData timerFlgData;
/*-----------------------------------------------------------*/
void vInitUserTimer(void)
{HAL_TIM_Base_Start_IT(&htim6);
}/*-----------------------------------------------------------*/
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//1ms
{static ul prv_ulCnt=0;if(htim==&htim6){if(!(prv_ulCnt% 20)){timerFlgData.ucMainRunFlg=1;}}
}
/*-----------------------------------------------------------*/
void vDelay_us(ul nus)
{        ul ticks;ul told,tnow,tcnt=0;ul reload=SysTick->LOAD;                             ticks=nus*fac_us;                         told=SysTick->VAL;                        while(1){tnow=SysTick->VAL;    if(tnow!=told){        if(tnow<told)tcnt+=told-tnow;    else tcnt+=reload-tnow+told;        told=tnow;if(tcnt>=ticks)break;            }  }
}
/*-----------------------------------------------------------*/void vDelay_ms(us nms)
{ul i;for(i=0;i<nms;i++) vDelay_us(1000);
}
/*-----------------------------------------------------------*/

14.新建一个userUtility.c文件用于放通用的程序,包括串口的回调函数,和串口错误处理函数,其头文件放类型重定义

#include "userUtility.h"
#include "uartDrive.h"
#include "usart.h"void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
{__HAL_UART_CLEAR_FLAG(huart,HAL_UART_GetError(huart));
}
/*-----------------------------------------------------------*//*-----------------------------------------------------------*/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if(huart == &huart1){vUartxRecData();}
//        else if(huart == &huart2)
//        {
//
//        }
//        else if(huart == &huart3)
//        {
//
//        }
//        else if(huart == &huart4)
//        {
//
//        }
}

#ifndef __USER_UTILITY_H
#define __USER_UTITITY_H
//头文件中的ifndef  - define - endif 可以用#pragma once来代替哦,使代码更简洁,更方便修改
#include "stdint.h"
#include "stm32f0xx_hal.h"typedef int32_t  sl;
typedef int16_t ss;
typedef int8_t  sc;typedef uint32_t  ul;
typedef uint16_t us;
typedef uint8_t  uc;#endif

15.最后新建一个doData.c文件 里面用于处理数据

头文件可以这样写(例如),好处是超过8位的数据通过匿名结构体分开,到时候通过串口发送什么的好处理

#pragma anon_unions
__packed struct SensorData
{uc ucPM25_AQI;uc ucHCHO_AQI;uc ucCO2_AQI;uc ucTVOC_AQI;uc ucAQI;__packed union{ss ssT;__packed struct{uc scT_L;uc scT_H;            };    };__packed union{us usH;__packed struct{uc ucH_L;uc ucH_H;            };    };__packed union{us usPM25;__packed struct{uc ucPM25_L;uc ucPM25_H;            };    };    __packed union{us usHCHO;__packed struct{uc ucHCHO_L;uc ucHCHO_H;            };    };        __packed union{us usCO2;__packed struct{uc ucCO2_L;uc ucCO2_H;            };    };        __packed union{us usTVOC;__packed struct{uc ucTVOC_L;uc ucTVOC_H;            };    };
};
extern struct SensorData sensorData;

16.以上大概就是我自己的风格,这样做的好处是,只有vUserInit();和vUserWhile();两个函数是被写在STM32CubeMX生成的代码中的,其他的代码均通过HAL库中德回调函数耦合在一起,方便维护和移植

17.另外到调试的时候注意,将Create HEX File勾上

还有debug中Setting的Reset and Run勾上(不勾上的话调试不会复位,让代码从头跑),写到这

突然想到不勾上这个对于排除bug的调试是不是有用的,不勾上这个直接调试,能不能看到出现bug时,

代码的运行情况,这个还真没用过。。。

转载于:https://www.cnblogs.com/ma77045728/p/8422369.html

STM32CubeMX+Keil裸机代码风格(2)相关推荐

  1. keil 更改黑色背景详细步骤,设置代码风格,添加自动格式化插件

    一.直接替换UV4目录下的global.prop配置文件 配置文件下载地址: https://www.lanzous.com/ib4q2ha 二.修改配置文件 #1.在KEIL安装目录下找到globa ...

  2. STM32CubeMX | 利用KEIL将代码下载能进内存(SRAM)实现RAM启动调试代码、解除读保护(Read Protection)功能

    STM32CubeMX | 利用KEIL将代码下载能进内存(SRAM)实现解除读保护 目录 STM32CubeMX | 利用KEIL将代码下载能进内存(SRAM)实现解除读保护 1.介绍 2.KEIL ...

  3. 【嵌入式基础】用C语言编程、寄存器实现LED流水灯程序;stm32CubeMX+Keil使用HAL库点亮流水灯

    本文主要介绍STM32F103系列芯片的地址映射和寄存器映射原理,GPIO端口的初始化设置步骤.利用C语言编程和寄存器点亮流水灯以及stm32CubeMX+Keil使用HAL库点灯 目录 一.STM3 ...

  4. 【嵌入式10】stm32CubeMX+Keil使用HAL库点灯,并使用逻辑分析仪观察周期

    stm32CubeMX+Keil使用HAL库点灯,并使用逻辑分析仪观察周期 一.题目要求 二.STM32CubeMX简介 1.利用CubeMX新建工程点亮LED灯 1)前期准备 2)新建工程 2.界面 ...

  5. 如何写出符合Python审美的代码风格?

    作者 | Rocky0429 来源 | Python空间 本文为 AI科技大本营投稿文章(欢迎给我们投稿,投稿请联系微信1092722531) 写在之前 每个人都有自己的代码风格,随着写的行数增加,自 ...

  6. 零基础自学Python:安装Python、解释器、代码风格等

    Python是一种面向对象.解释型计算机程序设计语言.语法简洁清晰,强制用空白符作为语句缩进.Python具有丰富和强大的库,又被称为胶水语言.能把其他语言(主要C/C++)写的模块很轻松的结合在一起 ...

  7. CSS中一些语法规范和代码风格

    CSS:美化网页和布局页面 语法规范: (1)CSS规则由两个主要的部分构成,选择器以及一条或多条声明: 注意:选择器是用于指定CSS样式的HTML标签,花括号内是对该对象设置的具体样式: 属性和属性 ...

  8. PHP PSR-2 代码风格规范 (中文版)

    代码风格规范 本篇规范是 PSR-1 基本代码规范的继承与扩展. 本规范希望通过制定一系列规范化PHP代码的规则,以减少在浏览不同作者的代码时,因代码风格的不同而造成不便. 当多名程序员在多个项目中合 ...

  9. FPGA之道(1)HDL代码风格

    文章目录 前言 代码风格 具体的代码风格 我的总结 前言 这个2020年是多灾多难的一年,作为被困在家无所事事的普通老百姓我来说,憋得实在难受,想想在学校的过去时间是如此之珍贵,此刻如此虚度,甚是愧疚 ...

最新文章

  1. Android 正则表达式实例
  2. linux 图形界面 X Server 关闭 启动
  3. openLayers3 中实现多个Overlay
  4. Spring Boot——一种包含分页和排序参数的接收方法DEMO
  5. java 根据客户端重定向_Java Web笔记 - 转发与重定向的区别与在FireBug客户端的表现...
  6. Derby数据库备份
  7. 不同浏览器隐藏默认表单样式
  8. leetcode 1160 python
  9. asp.net mvc 压缩html代码,浅谈ASP.NET中MVC 4 的JS/CSS打包压缩功能
  10. 2020华为软件精英挑战赛初赛-Java版本
  11. FreeBSD搭建Nginx+Apache24+php56+mysql56手把手一步步的笔记
  12. 基于帕累托最优的多目标SNP选择
  13. 怎么把计算机管理的磁盘找出来,电脑分区显示不出来怎么办
  14. mysql bit类型_MySQL bit类型
  15. 学习嵌入式Linux,做底层还是应用?底层要掌握哪些技能?
  16. du -sh * 与 ls -lh 显示文件大小不一样
  17. Linux系统配置文件 /etc/sysconfig详解
  18. 转:CDH--彻底解决问题----时钟异常
  19. 深度学习之环境配置--配置d2lzh_pytorch包
  20. 杰西·李佛摩尔的股市存亡战

热门文章

  1. Identity Server 4 原理和实战(完结)_----选看 OAuth 2.0 简介(上)
  2. Redis 订阅与发布
  3. java/android 做题中整理的碎片小贴士(15)
  4. JDK1.8下载与安装及环境变量配置
  5. 裴蜀(贝祖)定理及其证明
  6. 2.2优化编译器的能力和局限性
  7. 为 Joomla 而生的 Kunena 论坛安装手册
  8. require.js 的简单运用 --兰
  9. Java设计模式(10)代理模式(Proxy模式)
  10. golang语言os.Stat()用法及功能