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)

      

  • 相关阅读:
    关于词向量工作原理的理解
    LDA-线性判别分析(四)其他几个相关问题
    LDA-线性判别分析(三)推广到 Multi-classes 情形
    LDA-线性判别分析(一)预备知识
    LDA-线性判别分析(二)Two-classes 情形的数学推导
    为什么国内的网盘公司都在 TB 的级别上竞争,成本会不会太高?
    为什么我们喜欢用 sigmoid 这类 S 型非线性变换?
    UFLDL 教程学习笔记(四)主成分分析
    关于协方差矩阵的理解
    UFLDL 教程学习笔记(三)自编码与稀疏性
  • 原文地址:https://www.cnblogs.com/luckytimor/p/9227848.html
Copyright © 2011-2022 走看看