前言
不必害怕未知,无需恐惧犯错,做一个Creator!
本文主要介绍C语言编程规范。
一、函数及内容
函数的命名是字母,关键定义之间用下划线隔开,省略过的单词全大写,没省略的首字母大写每个函数前有函数说明变量命名遵循相应规则(如帕斯卡命名法:首字母大写 string UserName;)函数内的变量声明与执行语句要间隔一行不要在一行中写多个语句宏定义顶行写所有的注释全部用/**/ 而不用//规范函数内部的缩进和空格 函数体、判断、循环等存在分层,用TAB键缩进 关键字后(if for与后面的()),用空格隔开 二目运算符两侧(±*/),两侧用空格隔开 逗号后和语句中间分号后,两侧用空格隔开
/*
*********************************************************************************************************
* 函 数 名: HardFault_Handler
* 功能说明: 硬件故障中断服务程序。其他异常处理被关闭,而又发生了异常,则触发。
* 执行异常处理时,发生了异常,则触发。复位时默认使能。
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
void HardFault_Handler(void)
{
#if 1 //此处:宏定义顶行写;if后空格
const char *pError = ERR_INFO; //此处:分层用到缩进;变量命名用到帕斯卡命名法;双目运算符两侧空格
uint8_t i; //此处:变量声明与执行语句间隔开
for (i = 0; i < sizeof(ERR_INFO); i++)//此处:for关键字后用空格隔开;中间分号后用空格隔开;双目预算符两侧空格隔开
{
USART1->DR = pError[i];//此处:分层用到缩进;双目预算符两侧空格隔开;变量命名用到帕斯卡命名法
/* 等待发送结束 */
while ((USART1->SR & USART_FLAG_TC) == (uint16_t)RESET);此处:wihle关键字后用空格隔开;双目预算符两侧空格隔开
}
#endif
}
二、文件及内容
.c文件
文件的命名全部是小写字母,中间用下划线隔开开头处对文件进行说明,包括:名称、版本、说明、记录等(此处参考安富莱例程)行顶头进行#include头文件包含行顶头进行#define宏定义,并进行 左对齐 ,注意该处关键词命名方法(_进行分割+全大写)行顶头进行全局变量定义
/*
*********************************************************************************************************
*
* 模块名称 : 定时器模块
* 文件名称 : bsp_timer.c
* 版 本 : V1.2
* 说 明 : 配置systick定时器作为系统滴答定时器。缺省定时周期为1ms。
*
* 实现了多个软件定时器供主程序使用(精度1ms), 可以通过修改 TMR_COUNT 增减定时器个数
* 实现了ms级别延迟函数(精度1ms) 和us级延迟函数
* 实现了系统运行时间函数(1ms单位)
*
* 修改记录 :
* 版本号 日期 作者 说明
* V1.0 2013-02-01 armfly 正式发布
* V1.1 2013-06-21 armfly 增加us级延迟函数 bsp_DelayUS
* V1.2 2014-09-07 armfly 增加TIM4 硬件定时中断,实现us级别定时.20us - 16秒
*
* Copyright (C), 2014-2015, 安富莱电子 www.armfly.com
*
*********************************************************************************************************
*/
#include "bsp.h"
/*
定义用于硬件定时器的TIM, 可以使 TIM2 - TIM5
TIM3 和TIM4 是16位
TIM2 和TIM5 是32位
*/
#define TIM_HARD TIM5
#define TIM_HARD_IRQn TIM5_IRQn
#define TIM_HARD_RCC RCC_APB1Periph_TIM5
/* 这2个全局变量转用于 bsp_DelayMS() 函数 */
static volatile uint32_t s_uiDelayCount = 0;
static volatile uint8_t s_ucTimeOutFlag = 0;
.h文件
开头处对文件进行说明,包括:名称、版本、说明、记录等首先进行 #ifndef #define #endif宏定义 作用:防止头文件的重复包含和编译 注意该处关键词命名方法(_进行分割+全大写)行顶头进行结构体定义与函数声明
/*
*********************************************************************************************************
*
* 模块名称 : 定时器模块
* 文件名称 : bsp_timer.h
* 版 本 : V1.2
* 说 明 : 头文件
*
* Copyright (C), 2014-2015, 安富莱电子 www.armfly.com
*
*********************************************************************************************************
*/
#ifndef __BSP_TIMER_H
#define __BSP_TIMER_H
/*
在此定义若干个软件定时器全局变量
注意,必须增加__IO 即 volatile,因为这个变量在中断和主程序中同时被访问,有可能造成编译器错误优化。
*/
#define TMR_COUNT 4 /* 软件定时器的个数 (定时器ID范围 0 - 3) */
/* 定时器结构体,成员变量必须是 volatile, 否则C编译器优化时可能有问题 */
typedef enum
{
TMR_ONCE_MODE = 0, /* 一次工作模式 */
TMR_AUTO_MODE = 1 /* 自动定时工作模式 */
}TMR_MODE_E;
/* 提供给其他C文件调用的函数 */
void bsp_InitTimer(void);
void bsp_InitHardTimer(void);
void bsp_StartHardTimer(uint8_t _CC, uint32_t _uiTimeOut, void * _pCallBack);
#endif
提示:若有错误不足,欢迎批评指正。该系列文章仅供参考,欢迎互相学习交流。
感谢你的阅读,期待你的关注收藏点赞!