WIFI 模组8286驱动

news2024/11/13 14:33:50

 原理图:

 注:使用的数串口1的引脚,PA1是发送端引脚,PA3是接收端引脚,PA7串口的使能位。


1.0  WIFI模组驱动


驱动初始化函数:

void WifiModuleDrvInit(void)
{
	WifiGpioInit();
	WifiUartInit(115200);
	WifiDmaInit();
	HwresetWifiModule();
}

宏定义串口地址...

#define USART1_DATA_ADDR		(USART1 + 0x04)					// 串口2的数据寄存器16进制地址值
#define MAX_BUF_SIZE			256
static uint8_t	g_recvDataBuf[MAX_BUF_SIZE];

创建结构体:

typedef struct
{
	uint32_t uartNo;
	rcu_periph_enum rcuUart;
	rcu_periph_enum rcuGpio;
	uint32_t gpio;
	uint32_t txPin;
	uint32_t rxPin;
	uint8_t irq;
	uint32_t dmaNo;
	rcu_periph_enum rcuDma;
	dma_channel_enum dmaCh;
}UartHwInfo_t;

创建结构体数组:

static UartHwInfo_t g_uartHwInfo = 
{
	USART1,
	RCU_USART1,
	RCU_GPIOA,
	GPIOA,
	GPIO_PIN_2,
	GPIO_PIN_3,
	USART1_IRQn,
	DMA0,
	RCU_DMA0,
	DMA_CH5
};

GPIO初始化

static void WifiGpioInit(void)
{
	rcu_periph_clock_enable(RCU_GPIOA);
	gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_2MHZ, GPIO_PIN_7);
	
	rcu_periph_clock_enable(g_uartHwInfo.rcuGpio);
	gpio_init(g_uartHwInfo.gpio, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, g_uartHwInfo.txPin);
	gpio_init(g_uartHwInfo.gpio, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, g_uartHwInfo.txPin);
}

串口初始化:

static void WifiUartInit(uint32_t baudRate)
{
	rcu_periph_clock_enable(g_uartHwInfo.rcuUart);
	usart_deinit(g_uartHwInfo.uartNo);
	usart_baudrate_set(g_uartHwInfo.uartNo, baudRate);
	usart_transmit_config(g_uartHwInfo.uartNo, USART_TRANSMIT_ENABLE);
	usart_receive_config(g_uartHwInfo.uartNo, USART_RECEIVE_ENABLE);
	usart_interrupt_enable(g_uartHwInfo.uartNo, USART_INT_IDLE);
	// 使能串口中断,嵌套中断向量控制器
	nvic_irq_enable(g_uartHwInfo.irq, 0, 0);
	// 在USART_CTL0寄存器中设置UEN位,使能UART
	usart_enable(g_uartHwInfo.uartNo);	
}

DMA初始化:

static void WifiDmaInit(void)
{
	// 使能DMA时钟
	rcu_periph_clock_enable(g_uartHwInfo.rcuDma);
	// 复位DMA通道
	dma_deinit(g_uartHwInfo.dmaNo, g_uartHwInfo.dmaCh);
	// DMA结构体初始化
	dma_parameter_struct dmaStructure;
	// 配置数据传输方向
	dmaStructure.direction = DMA_PERIPHERAL_TO_MEMORY;
	// 配置数据的源地址
	dmaStructure.periph_addr = USART1_DATA_ADDR;
	// 配置源地址数固定地址还是增长,配置为固定地址
	dmaStructure.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
	// 配置数据传输位宽
	dmaStructure.periph_width = DMA_PERIPHERAL_WIDTH_8BIT;
	
	// 配置数据目的地址
	dmaStructure.memory_addr = (uint32_t)g_recvDataBuf;
	// 配置目的地址是固定的还是增长的
	dmaStructure.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
	// 配置目的数据传输位宽
	dmaStructure.memory_width = DMA_MEMORY_WIDTH_8BIT;
	// 配置数据传输最大次数
	dmaStructure.number = MAX_BUF_SIZE;
	// 配置DMA通道优先级
	dmaStructure.priority = DMA_PRIORITY_HIGH;
	// 初始化DMA
	dma_init(g_uartHwInfo.dmaNo, g_uartHwInfo.dmaCh, &dmaStructure);
	
	// 使能串口接收数据使用DMA
	usart_dma_receive_config(g_uartHwInfo.uartNo, USART_RECEIVE_DMA_ENABLE);
	// 使能DMA通道
	dma_channel_enable(g_uartHwInfo.dmaNo, g_uartHwInfo.dmaCh);
	
}

wifi驱动复位

void HwresetWifiModule(void)
{
	DBG_log("wifi module,now hwreset it!\n");
	gpio_bit_reset(GPIOA, GPIO_PIN_7);
	DelayNms(100);
	gpio_bit_set(GPIOA, GPIO_PIN_7);
}

串口中断服务函数:

void USART1_IRQHandle(void)
{
	if (usart_interrupt_flag_get(g_uartHwInfo.uartNo, USART_INT_FLAG_IDLE) != RESET)
	{
		// 获取中断标志位后清除中断标志位
		usart_interrupt_flag_clear(g_uartHwInfo.uartNo, USART_INT_FLAG_IDLE);
		usart_data_receive(g_uartHwInfo.uartNo);
		DBG_log("uart recv str:%s\n", g_recvDataBuf);
		dma_channel_disable(g_uartHwInfo.dmaNo, g_uartHwInfo.dmaCh);
		dma_transfer_number_config(g_uartHwInfo.dmaNo, g_uartHwInfo.dmaCh, MAX_BUF_SIZE);
		dma_channel_enable(g_uartHwInfo.dmaNo, g_uartHwInfo.dmaCh);
	}
}

获取接受和发送字符:

char *RecvWifiModuleStr(void)
{
	return (char*)g_recvDataBuf;
}

void ClearRecvWifiStr(void)
{
	memset(g_recvDataBuf, 0, MAX_BUF_SIZE);
}

void SendWifiModuleStr(const char *sendStr)
{
	DBG_log("uart send str:%d\n",sendStr);
	while(*sendStr != '\0')
	{
		usart_data_transmit(g_uartHwInfo.uartNo, *sendStr);
		while(RESET == usart_flag_get(g_uartHwInfo.uartNo, USART_FLAG_TBE));
		sendStr++;
	}
}

2.0 头文件

#ifndef _WIFI_DRV_H_
#define _WIFI_DRV_H_
#include <stdint.h>

void HwresetWifiModule(void);
void WifiModuleDrvInit(void);
void USART1_IRQHandle(void);
char *RecvWifiModuleStr(void);
void ClearRecvWifiStr(void);
void SendWifiModuleStr(const char *sendStr);

#endif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2070169.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

window系统如何适用redis

目录 1、解压缩安装包 2、命令行启动服务 3、客户端连接 4、redis客户端工具 1、解压缩安装包 2、命令行启动服务 3、客户端连接 4、redis客户端工具

CSS3多行多栏布局

当前布局由6个等宽行组成&#xff0c;其中第四行有三栏&#xff0c;第五行有四栏。 重点第四行设置&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>img {hei…

踩坑集之Video Processing Subsystem

问题描述 Video Processing Subsystem (VPSS) 功能强大&#xff0c;但我们在应用中只需要其中某个子功能。如果使用完整版本&#xff0c;资源消耗会非常大。VPSS将所有子功能封装在一起&#xff0c;所以我们将IP配置为仅包含CSC的模式&#xff0c;以为不需要的功能就不会影响系…

致远OA OCR票据识别组件

OCR票据识别 技术支持 技术大佬支持本文档 使用范围 任何票种信息&#xff0c;只要需要对接到oa底表中&#xff0c;就能够实现各种票种&#xff0c;各种字段的对接&#xff0c;包括票据识别&#xff0c;发票核验&#xff0c;适配各种票据 使用介绍 1 配置每种发票的ocr设…

【Nginx】快速入门

概述 Nginx(engine x)是一个高性能的HTTP和反向代理web服务器。 特点是占有内存小&#xff0c;并发能力强&#xff0c;简单易配置&#xff0c;支持高达 50000 个并发连接数的响应。 作用 代理 正向代理&#xff1a; 反向代理&#xff1a; 负载均衡 Nginx提供的负载均衡策…

专题---自底向上的计算机网络(物理层)

目录 计算机网络概述 物理层 数据链路层 网络层 运输层 应用层 网络安全 详细见http://t.csdnimg.cn/MY5aI http://t.csdnimg.cn/8Ipa4 http://t.csdnimg.cn/uvMxS 信道复用技术不仅在物理层有运用&#xff0c;在数据链路层也确实需要信道复用技术。‌ 数据链路层是…

推荐一个java企业级快速开发平台-JeeSite

文章目录 前言一、项目介绍二、技术选型基本技术框架其他技术框架分布式技术框架 三、项目特点四、功能介绍五、源码下载六、官方文档总结 前言 大家好&#xff0c;今天为大家推荐一个java 企业级系统快速开发平台&#xff0c;JeeSite。它是一个企业级快速开发解决方案&#x…

https://developer.nvidia.com/cuda-toolkit-archive

CUDA Toolkit Archive | NVIDIA Developerhttps://developer.nvidia.com/cuda-toolkit-archive

matplotlib color颜色全面指南

要想把数据表示得生动的趣&#xff0c;往往需要使用多种颜色来配合&#xff0c;才可以让数据得已区分开来。那么就来学习一下matplotlib的颜色。在matplotlib里主要使用一些简单的字母来表示颜色&#xff0c;比如&#xff1a; 参考&#xff1a; Matplotlib Color Tutorials L…

jmeter接口测试项目实战详解,零基础也能学

1.什么是jmeter&#xff1f; JMeter是100%完全由Java语言编写的&#xff0c;免费的开源软件&#xff0c;是非常优秀的性能测试和接口测试工具&#xff0c;支持主流协议的测试 2.jmeter能做什么&#xff1f; 1.JMeter是100%完全由Java语言编写的软件性能测试的GUI的测试工具&…

书生大模型实战营(第三期闯关大挑战)- 进阶岛 第六关 MindSearch CPU-only 版部署

0 项目介绍 书生大模型实战营三期进阶岛 增加了MindSearch 快速部署任务关卡。之前的任务是在彩蛋岛的任务&#xff0c;可能之前彩蛋岛的任务中用到了DuckDuckGoSearch 这个是国外网络才好访问&#xff0c;实际使用过程中需要通过一些魔法才能解决此任务。很多小伙伴卡在网络这…

uniapp检测手机是否打开定位权限Vue3-直接复制粘贴

安卓示例&#xff1a; 苹果示例&#xff1a; 代码实现&#xff08;vue3写法&#xff09;&#xff1a; const checkGPS ()>{console.log(开始监听GPS状态);let system uni.getSystemInfoSync(); // 获取系统信息if (system.platform android) { // 判断平台var context …

【数据中心小知识】电力需求如此重要,以至于数据中心通常以耗电量而非建筑面积来衡量

我们通常认为软件是完全数字化的存在&#xff0c;是一个完全独立于“原子”世界的“位”世界。我们可以在手机上下载无限量的数据&#xff0c;而手机却不会因此而变重&#xff1b;我们可以观看数百部电影而不用接触物理磁盘&#xff1b;我们可以收集数百本书而不需要拥有一张纸…

Comsol 考虑波导的二维星形空穴型声子晶体线缺陷压电能量收集优化方案

参考文献&#xff1a;Yang X , Zhong J , Xiang J .Optimization scheme for piezoelectric energy harvesting in line-defect for 2D starlike hole-type phononic crystals considering waveguides[J].AIP Advances, 2022, 12(1):-. 利用声子晶体(PnC)增强弹性波能收集是电…

SD差点挂掉,后备军们兴奋入场,AI生图应用正在爆发?

前后不到一个月&#xff0c;两个开源生图模型相继上线。 首先是由称得上 SD 原班人马的黑森林实验室推出的 FLUX.1。黑森林实验室由 Stable Diffusion 的核心开发者 Robin Rombach 领衔创立&#xff0c;团队成员基本上都是 Stable Diffusion 3 的作者&#xff0c;其中三名元老…

学习yolo+Java+opencv简单案例(二)

对于一些源码可以参考我上一篇博客&#xff1a;学习yoloJavaopencv简单案例&#xff08;一&#xff09;-CSDN博客 这篇文章主要演示的是使用面向对象优雅的实现图像识别&#xff1a; 也有接口演示&#xff0c;包括将Onnx对象放入Bean中程序跑起来就初始化一次&#xff08;重点…

AI产品经理的35岁危机_产品经理会有35岁危机吗

01 被裁的35岁朋友 去年&#xff0c;一家知名公司大裁员&#xff0c;很多 35 岁的非高管员工被牵连&#xff0c;包括我的一位朋友。 我第一时间联系了他&#xff0c;看看有没有能够帮上忙的地方。 我&#xff1a;传闻XX公司要收购你们&#xff1f; 朋友&#xff1a;是的。我要…

shell程序设计入门(二)

shell程序设计入门&#xff08;二&#xff09; 导语shell语法变量引号环境变量参数变量 条件控制结构if else循环forwhileuntil caseAND和ORANDOR 函数 总结参考文献 导语 shell语法 变量 shell变量和C语言的标识符命名的要求类似&#xff0c;在shell中&#xff0c;可以在变…

“易碎”的留守农村人,都在被AI智能监控“兜住”

文 | 智能相对论 作者 | 陈泊丞 “村里的四伯走了&#xff0c;是第二天傍晚被邻居家的七婶发现的。” 那晚&#xff0c;和家里的父母通电话&#xff0c;他们突然提起了这件事。 四伯虽说是父亲的堂兄弟&#xff0c;但是也只是辈分相当&#xff0c;在年纪上比父亲大上许多。…

零知识证明;Halo2原理;举例说明算术电路、转换为约束系统、多项式承诺举例形式和数值;PLANK算术化;

目录 零知识证明 简单举例说明原理 原理概述 Halo2原理 Halo2原理 举例说明关键性概念 举例说明算术电路、转换为约束系统、多项式承诺举例形式和数值 1. 算术电路构建 2. 转换为约束系统 3. 多项式承诺举例形式和数值 Halo2简单示例 PLANK算术化 基础概念 简单例…