STM32CubeMX+Keil裸机代码风格(2)
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)相关推荐
- keil 更改黑色背景详细步骤,设置代码风格,添加自动格式化插件
一.直接替换UV4目录下的global.prop配置文件 配置文件下载地址: https://www.lanzous.com/ib4q2ha 二.修改配置文件 #1.在KEIL安装目录下找到globa ...
- STM32CubeMX | 利用KEIL将代码下载能进内存(SRAM)实现RAM启动调试代码、解除读保护(Read Protection)功能
STM32CubeMX | 利用KEIL将代码下载能进内存(SRAM)实现解除读保护 目录 STM32CubeMX | 利用KEIL将代码下载能进内存(SRAM)实现解除读保护 1.介绍 2.KEIL ...
- 【嵌入式基础】用C语言编程、寄存器实现LED流水灯程序;stm32CubeMX+Keil使用HAL库点亮流水灯
本文主要介绍STM32F103系列芯片的地址映射和寄存器映射原理,GPIO端口的初始化设置步骤.利用C语言编程和寄存器点亮流水灯以及stm32CubeMX+Keil使用HAL库点灯 目录 一.STM3 ...
- 【嵌入式10】stm32CubeMX+Keil使用HAL库点灯,并使用逻辑分析仪观察周期
stm32CubeMX+Keil使用HAL库点灯,并使用逻辑分析仪观察周期 一.题目要求 二.STM32CubeMX简介 1.利用CubeMX新建工程点亮LED灯 1)前期准备 2)新建工程 2.界面 ...
- 如何写出符合Python审美的代码风格?
作者 | Rocky0429 来源 | Python空间 本文为 AI科技大本营投稿文章(欢迎给我们投稿,投稿请联系微信1092722531) 写在之前 每个人都有自己的代码风格,随着写的行数增加,自 ...
- 零基础自学Python:安装Python、解释器、代码风格等
Python是一种面向对象.解释型计算机程序设计语言.语法简洁清晰,强制用空白符作为语句缩进.Python具有丰富和强大的库,又被称为胶水语言.能把其他语言(主要C/C++)写的模块很轻松的结合在一起 ...
- CSS中一些语法规范和代码风格
CSS:美化网页和布局页面 语法规范: (1)CSS规则由两个主要的部分构成,选择器以及一条或多条声明: 注意:选择器是用于指定CSS样式的HTML标签,花括号内是对该对象设置的具体样式: 属性和属性 ...
- PHP PSR-2 代码风格规范 (中文版)
代码风格规范 本篇规范是 PSR-1 基本代码规范的继承与扩展. 本规范希望通过制定一系列规范化PHP代码的规则,以减少在浏览不同作者的代码时,因代码风格的不同而造成不便. 当多名程序员在多个项目中合 ...
- FPGA之道(1)HDL代码风格
文章目录 前言 代码风格 具体的代码风格 我的总结 前言 这个2020年是多灾多难的一年,作为被困在家无所事事的普通老百姓我来说,憋得实在难受,想想在学校的过去时间是如此之珍贵,此刻如此虚度,甚是愧疚 ...
最新文章
- Android 正则表达式实例
- linux 图形界面 X Server 关闭 启动
- openLayers3 中实现多个Overlay
- Spring Boot——一种包含分页和排序参数的接收方法DEMO
- java 根据客户端重定向_Java Web笔记 - 转发与重定向的区别与在FireBug客户端的表现...
- Derby数据库备份
- 不同浏览器隐藏默认表单样式
- leetcode 1160 python
- asp.net mvc 压缩html代码,浅谈ASP.NET中MVC 4 的JS/CSS打包压缩功能
- 2020华为软件精英挑战赛初赛-Java版本
- FreeBSD搭建Nginx+Apache24+php56+mysql56手把手一步步的笔记
- 基于帕累托最优的多目标SNP选择
- 怎么把计算机管理的磁盘找出来,电脑分区显示不出来怎么办
- mysql bit类型_MySQL bit类型
- 学习嵌入式Linux,做底层还是应用?底层要掌握哪些技能?
- du -sh * 与 ls -lh 显示文件大小不一样
- Linux系统配置文件 /etc/sysconfig详解
- 转:CDH--彻底解决问题----时钟异常
- 深度学习之环境配置--配置d2lzh_pytorch包
- 杰西·李佛摩尔的股市存亡战
热门文章
- Identity Server 4 原理和实战(完结)_----选看 OAuth 2.0 简介(上)
- Redis 订阅与发布
- java/android 做题中整理的碎片小贴士(15)
- JDK1.8下载与安装及环境变量配置
- 裴蜀(贝祖)定理及其证明
- 2.2优化编译器的能力和局限性
- 为 Joomla 而生的 Kunena 论坛安装手册
- require.js 的简单运用 --兰
- Java设计模式(10)代理模式(Proxy模式)
- golang语言os.Stat()用法及功能