一  工程习惯

    ①必须模块化编程-一个功能一个CH分开,一个对象一个结构体;

    ②习惯使用bsp.c/bsp.h,BSP板级支持包源文件;

    ③多使用#define 来定义IO口与硬件相关特性,方便修改;

二  实际应用

    模块化编程起始比较看实际使用场合, 这个和板级支持包有相同特性,使用时可以结合使用,硬件级底层配置全都在bsp文件里面编辑. 初始化的时候其实有一个比较好的实际使用可以供给使用:

void bsp_Init(void)
{
/* 优先级分组设置为4,可配置0-15级抢占式优先级,0级子优先级,即不存在子优先级。*/
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); bsp_InitUart(); /* 初始化串口 */
bsp_InitLed(); /* 初始LED指示灯端口 */
bsp_InitKey(); /* 初始化按键 */ }

       串口的初始化结构体用的比较好一点:

//初始化结构体->初始化硬件->初始化使用->初始化中断

void bsp_InitUart(void)
{
  UartVarInit(); /* 必须先初始化全局变量,再配置硬件 */   InitHardUart(); /* 配置串口的硬件参数(波特率等) */   RS485_InitTXE(); /* 配置RS485芯片的发送使能硬件,配置为推挽输出 */   ConfigUartNVIC(); /* 配置串口中断 */
} /* 串口设备结构体 */
typedef struct
{
  USART_TypeDef *uart;      /* STM32内部串口设备指针 */
  uint8_t *pTxBuf; /* 发送缓冲区 */
  uint8_t *pRxBuf; /* 接收缓冲区 */
  uint16_t usTxBufSize; /* 发送缓冲区大小 */
  uint16_t usRxBufSize; /* 接收缓冲区大小 */
  __IO uint16_t usTxWrite; /* 发送缓冲区写指针 */
  __IO uint16_t usTxRead; /* 发送缓冲区读指针 */
  __IO uint16_t usTxCount; /* 等待发送的数据个数 */
  __IO uint16_t usRxWrite; /* 接收缓冲区写指针 */
  __IO uint16_t usRxRead; /* 接收缓冲区读指针 */
  __IO uint16_t usRxCount; /* 还未读取的新数据个数 */
  
  void (*SendBefor)(void);       /* 开始发送之前的回调函数指针(主要用于RS485切换到发送模式) */
  void (*SendOver)(void);       /* 发送完毕的回调函数指针(主要用于RS485将发送模式切换为接收模式) */
  void (*ReciveNew)(uint8_t _byte);  /* 串口收到数据的回调函数指针 */
}UART_T; static void UartVarInit(void)
{
  #if UART1_FIFO_EN == 1
g_tUart1.uart = USART1; /* STM32 串口设备 */
g_tUart1.pTxBuf = g_TxBuf1; /* 发送缓冲区指针 */
g_tUart1.pRxBuf = g_RxBuf1; /* 接收缓冲区指针 */
g_tUart1.usTxBufSize = UART1_TX_BUF_SIZE;           /* 发送缓冲区大小 */
g_tUart1.usRxBufSize = UART1_RX_BUF_SIZE;           /* 接收缓冲区大小 */
g_tUart1.usTxWrite = 0; /* 发送FIFO写索引 */
g_tUart1.usTxRead = 0; /* 发送FIFO读索引 */
g_tUart1.usRxWrite = 0; /* 接收FIFO写索引 */
g_tUart1.usRxRead = 0; /* 接收FIFO读索引 */
g_tUart1.usRxCount = 0; /* 接收到的新数据个数 */
g_tUart1.usTxCount = 0; /* 待发送的数据个数 */
g_tUart1.SendBefor = 0; /* 发送数据前的回调函数 */
g_tUart1.SendOver = 0; /* 发送完毕后的回调函数 */
g_tUart1.ReciveNew = 0; /* 接收到新数据后的回调函数 */
  #endif
} #define RCC_ALL_LED (RCC_APB2Periph_GPIOB)
#define GPIO_PORT_LED1 GPIOB
#define GPIO_PIN_LED1 GPIO_Pin_0

#define LED_ON (PORT_LED->BRR = PIN_LED)
#define LED_OFF (PORT_LED->BSRR = PIN_LED)
#define LED_TOGGLE (PORT_LED->ODR ^= PIN_LED)

  

STM32进阶日志1的更多相关文章

  1. STM32学习日志--使用DMA功能自动更新PWM的输出

    /******************************************************************************* 编译环境: EWARM V5.30 硬 ...

  2. STM32学习日志

    今天是开学第二周周末 写这篇博客纯属是为了记住一些学到的知识,大佬勿喷.. 首先学32要知道一些选型知识,32中常用的芯片类型(某宝常卖的开发板芯片大多是这几种):C8T6,RBT6,RCT6,VET ...

  3. iOS开发进阶 - 日志输出框架CocoaLumberjack与XcodeColors插件的简单使用(swift版)

    CocoaLumberjack是Mac和iOS上一个集快捷.简单.强大和灵活于一身的日志框架.XcodeColors是用于控制台着色的工具,配合着CocoaLumberjack用有更好的效果,不废话, ...

  4. STM32进阶之串口环形缓冲区实现(转载)

    转载自微信公众号“玩转单片机”,感谢原作者“杰杰”. 队列的概念 在此之前,我们来回顾一下队列的基本概念:队列 (Queue):是一种先进先出(First In First Out ,简称 FIFO) ...

  5. STM32进阶之串口环形缓冲区实现

    队列的概念 在此之前,我们来回顾一下队列的基本概念: 队列 (Queue):是一种先进先出(First In First Out ,简称 FIFO)的线性表,只允许在一端插入(入队),在另一端进行删除 ...

  6. C语言进阶日志二

    1.一个功能模块最好使用一个文件夹包含 2.基本就需要几个文件,比如定时器取反  LED: bsp_led.c 和 bsp_led.h : 包含你需要的led外设GPIO的初始化代码 led_it.c ...

  7. 使用配置文件方式记录Python程序日志

    开发者可以通过三种方式配置日志记录: 调用配置方法的Python代码显式创建记录器.处理程序和格式化程序. 创建日志配置文件并使用fileConfig() 函数读取. 创建配置信息字典并将其传递给di ...

  8. python: 错误处理try详解 ,traceback调用栈, 调试(logging)

    摘录:https://www.liaoxuefeng.com/wiki/1016959663602400/1017598873256736 错误处理 调试 错误处理 高级语言都会使用内置的一套try. ...

  9. 通信方案软件设计(环形动态申请内存,支持USART+IIC+SPI+CAN协议

    1 <STM32进阶之串口环形缓冲区实现>中讲得比较清楚(链接) 2 amobbs中讲的方法有点复杂,以下是链接和参考源码: 通信方案软件设计(环形动态申请内存,支持USART+IIC+S ...

随机推荐

  1. python set 一些用法

    add(增加元素) name = set(['Tom','Lucy','Ben']) name.add('Juny') print(name)#输出:{'Lucy', 'Juny', 'Ben', ' ...

  2. 1014 Waiting in Line

    Suppose a bank has N windows open for service. There is a yellow line in front of the windows which ...

  3. 【MySQL】SQL中On和Where的区别

    数据库再通过链接两张表或者多张表时来返回记录时,都会生成一张中间的临时表,然后再将这张表返回给用户: 在使用left jion时,on和where条件的区别如下: 1. on条件是在生成临时表时使用的 ...

  4. UC-Android逆向工程师面试第2题分析

    博客链接:http://blog.csdn.net/qq1084283172/article/details/52133172 一.简介 这个题目是别人面试UC优视集团Android逆向工程师一职位的 ...

  5. AppScan扫描器的用法

    目录 AppScan 软件功能 建立一次基础的扫描 AppScan AppScan是一款非常好用且功能强大的Web 应用安全测试工具,曾以 Watchfire AppScan 的名称享誉业界,AppS ...

  6. ThinkPHP5 Apache / IIs环境下 URL重写

    thinkPHP5新版本 隐藏index.php隐藏index.php 都写好了 public 隐藏 独立主机可以直接把根目录指向public下 虚拟主机可以把public下的index.php放到根 ...

  7. window下批量删除指定后缀文件

    例子: 批量删除当前路径下后缀为 .jpg和 .json del /a /f /s /q "*.jpg" "*.json" *为通配符/a /f 是强制删除所有 ...

  8. 制作 PPT 的新方式出现了——GitHub 热点速览 v.21.19

    作者:HelloGitHub-小鱼干 想当初 Markdown 的出现,拯救了多少死在 Word 样式调整上的人,现在,slidev 出现了,它让你 Focus 在本该专注的 PPT 内容制作上而不需 ...

  9. 一次 Go 程序 out of memory 排查及反思

    前言 最近在搞数据导出模块,在测试大文件下载的过程中,报了 Out of memory (OOM) 错误,因为之前没有遇到过这类问题,导致此次排查问题花费了大半天,也走了不少弯路,特此复盘记录. 现象 ...

  10. mysql搭建多主一从源复制环境

    问题描述:搭建过一主多从的环境,由于数据库数据一致性要求高,有些情景会搭建一主多从的架构,搭建多主一从的模式,相对来说适合数据整合,将多个业务的库整合到一起,方便做查询,也可以当做一个监控其他主库数据 ...