博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
STM32进阶日志1
阅读量:5093 次
发布时间:2019-06-13

本文共 2429 字,大约阅读时间需要 8 分钟。

一  工程习惯

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

  

转载于:https://www.cnblogs.com/luckytimor/p/9227848.html

你可能感兴趣的文章
可选参数的函数还可以这样设计!
查看>>
走高端树品牌 IT大佬竞相“归田”
查看>>
大型网站应用之海量数据和高并发解决方案总结一二
查看>>
[BZOJ4518][SDOI2016]征途(斜率优化DP)
查看>>
Android recycleView的研究和探讨
查看>>
HDU1024 Max Sum Plus Plus 【DP】
查看>>
[你必须知道的.NET]第二十一回:认识全面的null
查看>>
十六进制的ASCII码 "\u6cf0\u56fd" 解码成unicode
查看>>
Java语言概述
查看>>
关于BOM知识的整理
查看>>
android中自定义下拉框(转)
查看>>
Android设计模式源码解析之外观模式(Facade)
查看>>
使用word发布博客
查看>>
构建oracle12c的Docker镜像
查看>>
用户权限命令(chmod,chown,umask,lsattr/chattr)
查看>>
Maven详解
查看>>
Linux系统中‘dmesg’命令处理故障和收集系统信息的7种用法
查看>>
数据结构 : Hash Table [II]
查看>>
面向对象的小demo
查看>>
获取地址栏参数
查看>>