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