zoukankan      html  css  js  c++  java
  • STM32进阶日志1

    一  工程习惯

        ①必须模块化编程-一个功能一个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)

      

  • 相关阅读:
    产品经理的职责有哪些?到底该做什么?(转) 写的非常好,非常专业
    互联网界产品经理和项目经理(转) 总结的非常好
    各式结构化数据 动态 接入-存储-查询 的处理办法 (第二部分)
    各式结构化数据 动态 接入-存储-查询 的处理办法 (第一部分)
    不规矩的xml与JAVA对象互相转换的小技巧-使用Marshaller
    大数据架构-使用HBase和Solr将存储与索引放在不同的机器上
    小程序项目别的页面初始化拿到的值为两种状态(已解决)
    vue项目引入第三方js插件,单个js文件引入成功,使用该插件方法时报错(问题已解决)
    qs.stringify和JSON.stringify的使用和区别
    百度地图API-javascript-web地图的应用
  • 原文地址:https://www.cnblogs.com/luckytimor/p/9227848.html
Copyright © 2011-2022 走看看