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)

      

  • 相关阅读:
    我的小问题
    js实现随机的四则运算题目
    VC++ 6.0 无法打开文件
    VC6.0致命错误 RC1015: 无法打开包含文件 'afxres.h'.解决方案
    VS2010 如何添加H文件目录和LIB目录
    学习计划(四月)
    IIS与apache的对比:大杂烩
    ubuntu下有线网卡启动(Atheros AR8161 Gigabit Ethernet)
    putty终端乱码解决办法
    Proxy Switchysharp配置
  • 原文地址:https://www.cnblogs.com/luckytimor/p/9227848.html
Copyright © 2011-2022 走看看