D2 智慧教室项目驱动开发
一、环境监控驱动开发
外设驱动开发流程
(一)时钟&SWD配置
原理图分析
时钟原理图
如下图所示,STM32F407外部高速晶振为25MHz,分别连接到PH0和PH1引脚!
SWD原理图
如下图所示,STM32F407仿真接口SWD分别连接到PA13和PA14引脚!
外设配置
时钟外设配置
使能时钟源
- 选择RCC外设
- 选择高速时钟为外部时钟源
- PH0和PH1引脚自动高亮
配置时钟树
- 锁相环时钟源为25MHz外部高速时钟
- 高速时钟分频系数配置为25,输出为1MHz
- 倍频系数配置为336
- 分频系数配置为2,输出为168MHz
- 系统时钟源选择PLL
- APB1配置为4分频,为42MHz
- APB2配置为2分频,为84MHz
SWD外设配置
- 选择SYS外设
- 配置debug接口为串行接口(SWD)
- 引脚自动高亮
(二)串口配置
原理图分析
Zigbee通信接口
- J28为Zigbee模块底座,其中Z_W_R和Z_W_T分别Zigbee串行通信接口
- Z_W_R和Z_W_T网络连接到J13,通过J13选择连接STM32还是USB转串口,我们选择连接到STM32上的USART1(PA9和PA10)
串行调试接口
如下图所示:
- 板载两个串行通信接口,串口1连接到USART1,串口2连接到USART3,我们选择USART3
- 由于USART3可以用于串口和485通信,我们选择485必须要把CON4和CON5拨到串口通信
外设配置
USART1配置
- 配置PA9和PA10为USART1模式
- 打开USART1,配置为异步通信模式
3.使能NVIC,优先级先默认为0
USART3配置
- 配置PB10和PB11为USART3模式
- 打开USART3外设,并配置为异步通信模式
(三)GPIO配置
原理图分析
- PF7 PF8 PF9 PF10 控制板载的D6 D7 D8 D9
- PF6控制板载蜂鸣器
GPIO外设配置
- 配置PF6-PF10为输出模式
- PF6默认输出低
- PF7-PF10默认输出高
二、人机交互驱动开发
(一)FSMC
1、SRAM
原理图分析
通过下图所示:
- 采用IS61LV51216 SRM 为1MB,其实为了节约成本焊接的为IS61LV25616 为512KB
- 占用地址总线为18bit,数据总线为16bit
- 内存访问起始地址为0x6800 0000
数据手册分析
read周期
地址建立时间 <7ns
数据建立+保持时间 = 7 + 2.5ns = 10ns
write周期
数据建立周期 = 5 + 3 = 8 + 5ns = 13ns
FSMC读写周期
read
write
外设配置
- 打开FSMC外设
- 配置FSMC
- 选择存储块为NE3
- 内存类型为SRAM
- 寻址长度为18bit
- 数据宽度为16bit
- 配置FSMC时序
- 地址建立时间为1分频 1/168 = 0.005 = 5ns
- 数据建立时间为3分频
- 字节访问使能
2、LCD
原理图分析
- 如下图所示,LCD采用8080接口,CS片选,D/C命令/数据切换,RD读操作,WR写操作,D[23:0]数据总线
- 如下图所示,数据总线D[0:15]连接FSMC总线接口处,RS起始就D/C接口,连接到FSMC地址总线A0,CS片选总线连接到FSMC_NE4上,WR写操作连接FSMC_NWE总线上,RD读操作总线连接到FSMC_NOE上,背光控制连接到PC7上
- 写命令操作0x6C00 0000
- 写数据操作0x6C00 0002
数据手册分析
-
分析LCD驱动芯片时序图,计算得出地址和数据总线建立时间
地址保持周期 = 2ns
数据建立周期 = 12 + 1ns = 15ns
外设配置
- 打开FSMC外设
- 配置FSMC参数
- 内存块为NE4
- 内存类型为LCD
- LCD数据/命令切换映射到A0
- 数据宽度为16bit
- 配置PC7为输出模式
- 上电默认输出高电平
- 上电默认输出高电平
SPI
FLASH
原理图分析
- 如下图所示,SPI接口,CS连接到PH2,MISO连接到PB4,MOSI连接到PB5,CLK连接到PA5
数据手册分析
1.时钟极性及相位
通过时序图分析,SPI CLK 高有效 时钟极性为高
时钟边沿为奇数边沿
2.SPI速率
满足数据传输速率,最大不能超过33MHz
外设配置
- 配置SPI时钟和数据引脚
- 配置SPI为全双工主机模式
- 配置SPI参数
- 通信速率为系统时钟4分频
- 时钟极性为低电平
- 相位为奇数边沿
- 配置片选引脚PH2默认输出高
Touch
原理图分析
- 如下图所示,SPI接口,CS连接到PG15,MISO连接到PI2,MOSI连接到PI3,SCK连接到PI1
- 触摸中断连接到PG7
数据手册分析
- 通过计算TCH+TCL得出SPI通信速率
- 通过时序图分析,SPI不工作时为低电平
- 时钟边沿为奇数边沿
- 通信速率最小为400ns,大概2Mbit/S左右
外设配置
- 配置SPI时钟和数据引脚
- 配置SPI为全双工主机模式
- 配置SPI参数
- 通信速率为系统时钟32分频
- 时钟极性为低电平
- 相位为奇数边沿
- 配置SPI片选引脚
- 配置PG15为输出模式
- 配置PG15上电默认输出高,SPI低电平有效
三、WebServer驱动开发
(一)SDIO
原理图分析
根据原理图分析,我们采用SD总线,4bit
配置CLK、DAT0-3
外设配置
- 打开SDIO外设
- 配置SD总线为4bit位宽
- 配置DMA接收和发送
- 使能sdio全局中断 重点配置DMA优先级小于SDIO优先级
(二)ETH
原理图分析
-
如下图所示,以太网PHY采用DP83848芯片,通信模式采用RMII接口
-
配置MDC、CLK、MDIO、DV、RXD0、RXD1;EN、TXD0、TXD1
数据手册分析
PHY地址
PHY寄存器
BMCR
BMSR
PHYSTS
外设配置
四、FreeRTOS配置及任务创建
(一)freeRTOS配置
配置内核定时器
由于我们采用STM32HAL库进行开发,HAL库内部使用systick定时器用于系统延时功能,而FreeRTOS也需要一个定时器用于操作系统内核调度使用, 顾需要修改HAL定时器时钟源
- 打开SYS选项
- 配置时钟源为TIM1
配置FreeRTOS内核功能
- 多数功能在后续程序设计中,需要根据具体功能,进行配置
- 前期只需要配置动态内存空间和创建开始任务就可以
配置动态内存分配空间
- 采用FreeRTOS动态内存分配,开发效率高!顾我们程序内存使用,多数使用动态内存分配方式,分配动态内存总空间为23k=23552byte
2. 使能FreeRTOS功能
3. 分配内存空间为40960
(二)任务创建
任务及优先级划分
任务堆栈划分
1、中断优先级分配
2、printf重定向
- 在main.c文件内添加fputc函数,采用USART3作为调试接口
int fputc(int ch, FILE *p)
{
while(!(USART1->SR & (1<<7)));
USART1->DR = ch;
return ch;
}
- 在touch任务内打印启动信息
五、lwIP配置及网卡驱动
(一)lwIP配置
1、IP组网配置
- 使能lwIP
- 关闭DHCP服务
- 配置IP地址信息
2、lwIP参数配置
- 分配10k内存空间
- 使能链路检测回调功能
(二)ping测试
配置笔记本的网段和STM32开发板的网段一致
以太网断线检测
ethernetif.c
/* USER CODE BEGIN 8 */
/**
* @brief This function notify user about link status changement.
* @param netif: the network interface
* @retval None
*/
__weak void ethernetif_notify_conn_changed(struct netif *netif)
{
/* NOTE : This is function could be implemented in user file
when the callback is needed,
*/
if(netif_is_link_up(netif)){
printf("netif link is up\r\n");
if(!netif_is_up(netif)){
netif_set_up(netif);
printf("netif is up\r\n");
}
}else{
printf("netif link is down\r\n");
}
}
两种情况,一种是设备通电时断开网线,一种是网线没插,设备通电
- 第一种, 断开网线之后再插入,通过ping命令进行检测
- 第二种,断开网线,设备通电,当设备正常工作后,再插入网线,通过ping命令进行检测。