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=;//时钟多少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=;
if(htim==&htim6)
{
if(!(prv_ulCnt% ))
{
timerFlgData.ucMainRunFlg=;
}
}
}
/*-----------------------------------------------------------*/
void vDelay_us(ul nus)
{
ul ticks;
ul told,tnow,tcnt=;
ul reload=SysTick->LOAD;
ticks=nus*fac_us;
told=SysTick->VAL;
while()
{
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=;i<nms;i++) vDelay_us();
}
/*-----------------------------------------------------------*/
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时,
代码的运行情况,这个还真没用过。。。

STM32CubeMX+Keil裸机代码风格(2)的更多相关文章
- STM32CubeMX+Keil裸机代码风格(1)
1.打开STM32CubeMX,New project 选好自己要用的芯片 2.选上左侧SYS中的debug Serial Wire(定义烧程序的端口) . 3,选上左侧TIM6,使TIM6可用(TI ...
- Python 代码风格
1 原则 在开始讨论Python社区所采用的具体标准或是由其他人推荐的建议之前,考虑一些总体原则非常重要. 请记住可读性标准的目标是提升可读性.这些规则存在的目的就是为了帮助人读写代码,而不是相反. ...
- .NET 项目代码风格要求
原文:http://kb.cnblogs.com/page/179593/ 项目代码风格要求 PDF版下载:项目代码风格要求V1.0.pdf 代码风格没有正确与否,重要的是整齐划一,这是我拟的一份&l ...
- AngularJS之代码风格36条建议【一】(九)
前言 其实在新学一门知识时,我们应该注意下怎么书写代码更加规范,从开始就注意养成一个良好的习惯无论是对于bug的查找还是走人后别人熟悉代码都是非常好的,利人利己的事情何乐而不为呢,关于AngularJ ...
- Visual Studio Code 使用 ESLint 增强代码风格检查
前言 在团队协作开发中,为了统一代码风格,避免一些低级错误,应该设有团队成员统一遵守的编码规范.很多语言都提供了Lint工具来实现这样的功能,JavaScript也有类似的工具:ESLint.除了可以 ...
- plain framework 1 参考手册 入门指引之 代码风格
代码风格 介绍 介绍 框架自身采用了google的C++风格,作者也鼓励在你的应用中使用此风格,有关此风格你可以查阅相关资料了解.下面是一段plain framework中的代码,以便大家参考: 你可 ...
- 对 JimmyZhang 老师的文章《项目代码风格要求》的一些个人观点
Jimmy Zhang 老师是博客园中我最佩服的人之一,今天看了他的文章<项目代码风格要求>觉得大部分地方我都很认同,工作中也是强迫自己也要按照规范来编程.下面是我的一些个人观点,想贴出来 ...
- python代码风格-PEP8
转载自http://www.douban.com/note/134971609/ Python 的代码风格由 PEP 8 描述.这个文档描述了 Python 编程风格的方方面面.在遵守这个文档的条件下 ...
- Google HTML/CSS代码风格指南(中文版)
原文链接:http://wncbl.cn/posts/c8e10815/ 看一下没什么印象,那就写一遍吧. 背景 本文档定义了HTML/CSS的编写格式和风格规则.它旨在提高合作和代码质量,并使其支持 ...
随机推荐
- ucos中信号量 事件标志 消息队列都怎么用
信号量 事件标志和消息队列分别应用于什么场景(反正我学的时候有点闹不清,现在总结一下): 信号量和事件标志用于任务同步.详细来说,这个功能可以替代以前裸机中你打一个标记的功能,比如使用了一个定时器,5 ...
- 高性能mysql 事务笔记
事务的四大特性原子性.一致性.隔离性.持久性, 事务隔离的四大隔离级别: READ UNCOMMITTED(未提交读), 在 read uncommitted级别,事务中的修改,及时没有提交,对其他事 ...
- 网站JS控制的QQ悬浮
这是一个网站JS控制的QQ悬浮客服:代码1document.writeln("<div id=\"feedback\"><div id=\"f ...
- SQLServer 主键、外键、唯一等约束
主键(primary key)约束.外键(foreign key)约束.唯一(unique)约束.检查(check)约束.默认值(default)约束实例 Oracle 有如下类型的约束:NOT NU ...
- docker log driver
驱动程序 描述 none 容器没有日志可用,docker logs 什么都不返回 json-file 日志格式化为 JSON.这是 Docker 默认的日志驱动程序. syslog 将日志消息写入 s ...
- 人脸识别1:n对比 (一)
本项目采用了 Face++人脸识别 第三方接口,实现了自选本地手机相册图片上传人脸(faceSet中添加人脸) 和 自选本地手机相册图片寻找出集合中相似度最高的一个face,可返回比对相似度等信息. ...
- windows7 python3.4 安装scrapy
首先升级pip 虽然提示说已经升级,但是查看版本还是发现不对,随即进入C:\Python34\Lib\site-packages 查看已经存在9.0.1的版本,怎么办?将其移除,重新升级 安装lxml ...
- python3 安装 basemap 包(windows10)
下载 pyproj 和 basemap 的安装包 basemap 是具有专业标准的地图绘制工具,可以与 matplotlib 的一般绘图功能结合,在地图上绘制数据. basemap 文档:https: ...
- 洛谷 P1338 末日的传说
题目链接:https://www.luogu.org/problemnew/show/P1338 题目描述 只要是参加jsoi活动的同学一定都听说过Hanoi塔的传说:三根柱子上的金片每天被移动一次, ...
- docker常用操作备忘
一.docker安装 参考资料:阿里云镜像加速1. 安装/升级Docker客户端 curl -fsSL https://get.docker.com | bash -s docker --mirror ...