一  工程习惯

    ①必须模块化编程-一个功能一个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. Spring学习笔记(五):JDBCTemplate+事务管理

    1 概述 Spring为开发者提供了JDBCTemplate,可以简化很多数据库操作相关的代码,本文主要介绍JDBCTemplate的使用以及事务管理功能. 2 JDBC Template 2.1 配 ...

  2. 一.文件处理和json模块(容易混淆知识点即用法)

    一.文件处理 注意点1: 打开文件包含两部分资源:操作系统级打开得文件+应用程序的变量. 在操作完毕一个文件时,必须把该文件的两部分资源一个不落的回收 如下: f.close() #回收操作系统级打开 ...

  3. 前端进阶(2)使用fetch/axios时, 如何取消http请求

    前端进阶(2)使用fetch/axios时, 如何取消http请求 1. 需求 现在前端都是SPA,我们什么时候需要取消HTTP请求呢? 当我们从一个页面跳转到另外一个页面时,如果前一个页面的请求还没 ...

  4. Django+Vue+Docker搭建接口测试平台实战

    一. 开头说两句 大家好,我叫林宗霖,是一位测试工程师,也是全栈测开训练营中的一名学员. 在跟着训练营学习完Docker容器技术系列的课程后,理所应当需要通过实操来进行熟悉巩固.正好接口自动化测试平台 ...

  5. 三维 WebGIS 新玩具:OpenGlobus

    代码仓库地址:https://github.com/openglobus/openglobus 原创.@秋意正寒 目录 1 简介 2 HelloGlobus 3 在 Vite 中与 vue3 集成 4 ...

  6. (数据科学学习手札119)Python+Dash快速web应用开发——多页面应用

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 这是我的系列教程Python+Dash快速web ...

  7. 1068 Find More Coins

    Eva loves to collect coins from all over the universe, including some other planets like Mars. One d ...

  8. Unittest单元测试框架——BeautifulReport测试报告和Yagmail自动发送邮件

    一.前言 之前在做appium自动化的时候,已经提到过unittest框架的基本概念.用例执行,以及BeautifulReport测试报告的简单使用了(地址:https://www.cnblogs.c ...

  9. PHP--date转成时间戳,time()获取的是秒数

    date("Y-m-d H:i:s");  //如果存成datetime型在MYSQL中 必须用这种格式 实现功能:获取某个日期的时间戳,或获取某个时间的时间戳.strtotime ...

  10. 织梦DedeCMS自定义表单diy_list.htm

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...