其实在开发板使用的WIFI(ESP8266模块)、蓝牙、GPS都是封装好的模块,根据一些特定指令就即可进行相关操作。如使用AT指令就可以操作WIFI模块。至于具体的wifi模块的AT指令如何使用这里就不说了,改天另外写一个博客吧。
这里主要是就是写USART3的应用,通过USART3接收数据转到USART1打印到串口调试助手。
其实搞这个的话,主要是就是通过所使用的模块与USART3连接,通过CPU连接到USART1转发到PC

1.硬件配置

首先就是在CUBEMX上对管脚进行相应的配置。下面是管脚的配置图

串口1使用的是默认设置。

USART3也是,但是如果要使用GPS的话波特率是要设置为38400 Bits/s,这个是因为ATK_S1216F8_BD模块的出厂默认波特率就是这个。因为涉及到接收和发送,特别是串口的接收是涉及到接收中断的,下面就是关于定时器的配置,在这里使用的是通用定时器7.

由于在整个工作过程中存在优先级的问题(如果没有优先级之分工作就会因此冲突。)所以这里要设置优先级

接下来就是生成工程啦。

2.修改程序

在usart.c文件的中加入Printf的重定义函数

struct __FILE
{ int handle;
}; FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
void _sys_exit(int x)
{ x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{   while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   USART1->DR = (uint8_t) ch;      return ch;
}uint16_t USART3_RX_STA=0;
uint8_t USART3_RX_BUF[800];
__align(8) uint8_t USART3_TX_BUF[800];

并且在USART3的USART3_MspInit函数中加入USART3的接收函数

  /* USER CODE BEGIN USART3_MspInit 1 */__HAL_UART_ENABLE_IT(&huart3,UART_IT_RXNE);      //开启接收中断HAL_NVIC_EnableIRQ(USART3_IRQn);                //使能USART3中断HAL_NVIC_SetPriority(USART3_IRQn,2,3);          //抢占优先级2,子优先级3   MX_TIM7_Init();     //100ms中断USART3_RX_STA=0;      //清零//TIM7->CR1&=~(1<<0);        //关闭定时器7__HAL_TIM_DISABLE(&htim7);

然后在/* USER CODE BEGIN 1 */加入串口的重定

/* USER CODE BEGIN 1 */void u3_printf(char* fmt,...)
{  uint16_t i,j; va_list ap; va_start(ap,fmt);vsprintf((char*)USART3_TX_BUF,fmt,ap);va_end(ap);i=strlen((const char*)USART3_TX_BUF);       //此次发送数据的长度for(j=0;j<i;j++)                           //循环发送数据{while((USART3->SR&0X40)==0);          //循环发送,直到发送完毕   USART3->DR=USART3_TX_BUF[j];  }
}/* USER CODE END 1 */

修改完串口的程序之后就是定时器的了

/* TIM7 init function */
void MX_TIM7_Init(void)
{TIM_MasterConfigTypeDef sMasterConfig = {0};htim7.Instance = TIM7;htim7.Init.Prescaler = 8999;htim7.Init.CounterMode = TIM_COUNTERMODE_UP;htim7.Init.Period = 999;htim7.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;if (HAL_TIM_Base_Init(&htim7) != HAL_OK){Error_Handler();}sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;if (HAL_TIMEx_MasterConfigSynchronization(&htim7, &sMasterConfig) != HAL_OK){Error_Handler();}HAL_TIM_Base_Start_IT(&htim7);   //使能定时器7和定时器7更新中断:TIM_IT_UPDATE
}void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
{if(tim_baseHandle->Instance==TIM7){/* USER CODE BEGIN TIM7_MspInit 0 *//* USER CODE END TIM7_MspInit 0 *//* TIM7 clock enable */__HAL_RCC_TIM7_CLK_ENABLE();/* TIM7 interrupt Init */HAL_NVIC_SetPriority(TIM7_IRQn, 5, 0);HAL_NVIC_EnableIRQ(TIM7_IRQn);/* USER CODE BEGIN TIM7_MspInit 1 */HAL_NVIC_SetPriority(TIM7_IRQn,0,1);    //设置中断优先级,抢占优先级0,子优先级1HAL_NVIC_EnableIRQ(TIM7_IRQn);          //开启ITM7中断 /* USER CODE END TIM7_MspInit 1 */}
}void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle)
{if(tim_baseHandle->Instance==TIM7){/* USER CODE BEGIN TIM7_MspDeInit 0 *//* USER CODE END TIM7_MspDeInit 0 *//* Peripheral clock disable */__HAL_RCC_TIM7_CLK_DISABLE();/* TIM7 interrupt Deinit */HAL_NVIC_DisableIRQ(TIM7_IRQn);/* USER CODE BEGIN TIM7_MspDeInit 1 *//* USER CODE END TIM7_MspDeInit 1 */}
} 

这个就是关于定时器的程序了。都是在USER CODE BEGIN/END里面加的。
然后接收中断的程序是在stm32f4xx_it.c文件里面。

void USART3_IRQHandler(void)
{/* USER CODE BEGIN USART3_IRQn 0 *//* USER CODE END USART3_IRQn 0 */HAL_UART_IRQHandler(&huart3);/* USER CODE BEGIN USART3_IRQn 1 */uint8_t res;         if(__HAL_UART_GET_FLAG(&huart3,UART_FLAG_RXNE)!=RESET)//接收到数据{
//      HAL_UART_Receive(&UART3_Handler,&res,1,1000);res=USART3->DR;             if((USART3_RX_STA&(1<<15))==0)//接收完的一批数据,还没有被处理,则不再接收其他数据{ if(USART3_RX_STA<800)    //还可以接收数据{//              __HAL_TIM_SetCounter(&TIM7_Handler,0);  TIM7->CNT=0;                        //计数器清空 if(USART3_RX_STA==0)              //使能定时器7的中断 {//                  __HAL_RCC_TIM7_CLK_ENABLE();            //使能TIM7时钟//    TIM7->CR1|=1<<0;              //使能定时器7__HAL_TIM_ENABLE(&htim7);}USART3_RX_BUF[USART3_RX_STA++]=res;    //记录接收到的值    }else {USART3_RX_STA|=1<<15;                //强制标记接收完成} }printf("%c",res);}                                               /* USER CODE END USART3_IRQn 1 */
}

这个是我的程序,但是这个接收中断在不同型号的单片机上不一定能用,需要根据自己的板子进行修改。
然后是定时器的接收中断。

void TIM7_IRQHandler(void)
{/* USER CODE BEGIN TIM7_IRQn 0 *//* USER CODE END TIM7_IRQn 0 */
//  HAL_TIM_IRQHandler(&htim7);/* USER CODE BEGIN TIM7_IRQn 1 */if(__HAL_TIM_GET_FLAG(&htim7,TIM_FLAG_UPDATE)!=RESET)    //更新中断{USART3_RX_STA|=1<<15;                                       //标记接收完成__HAL_TIM_CLEAR_IT(&htim7,TIM_IT_UPDATE);            //清除中断//   TIM7->CR1&=~(1<<0);               //关闭定时器7 __HAL_TIM_DISABLE(&htim7);                           //关闭定时器7 }             /* USER CODE END TIM7_IRQn 1 */
}

基本上关于USART3的接收以及通过USART1的转发在这里就可以实现了。
然后关于GPS,对于GPS是直接从原子的例程里面直接移植过来的,我在这里就不赘述了,如果有需要的可以在留言留下邮箱找我要。
然后在主函数里加入

/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */#include "stm32f4xx_it.h"
#include "gps.h"
/* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD *//* USER CODE END PTD *//* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
extern  uint8_t USART3_RX_BUF[800];
uint8_t USART1_TX_BUF[800];                     //串口1,发送缓存区    USART3_MAX_RECV_LEN=800
nmea_msg gpsx;                                          //GPS信息
__align(4) uint8_t dtbuf[50];                                   //打印缓存器
const uint8_t*fixmode_tbl[4]={"Fail","Fail"," 2D "," 3D "};    //fix mode字符串
extern  uint8_t  USART3_RX_STA;
/* USER CODE END PD *//* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ---------------------------------------------------------*//* USER CODE BEGIN PV *//* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP *//* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
void Gps_Msg_Show(void)
{float tp;               tp=gpsx.longitude;       sprintf((char *)dtbuf,"Longitude:%.5f %1c   ",tp/=100000,gpsx.ewhemi);    //得到经度字符串printf("%s",dtbuf);         tp=gpsx.latitude;      sprintf((char *)dtbuf,"Latitude:%.5f %1c   ",tp/=100000,gpsx.nshemi); //得到纬度字符串printf("%s",dtbuf);       tp=gpsx.altitude;    sprintf((char *)dtbuf,"Altitude:%.1fm     ",tp/=10);                  //得到高度字符串printf("%s",dtbuf);                 tp=gpsx.speed;     sprintf((char *)dtbuf,"Speed:%.3fkm/h     ",tp/=1000);                    //得到速度字符串    printf("%s",dtbuf);                      if(gpsx.fixmode<=3)                                                     //定位状态{  sprintf((char *)dtbuf,"Fix Mode:%s",fixmode_tbl[gpsx.fixmode]);  printf("%s",dtbuf);              }            sprintf((char *)dtbuf,"GPS+BD Valid satellite:%02d",gpsx.posslnum);          //用于定位的GPS卫星数printf("%s",dtbuf);      sprintf((char *)dtbuf,"GPS Visible satellite:%02d",gpsx.svnum%100);           //可见GPS卫星数printf("%s",dtbuf);sprintf((char *)dtbuf,"BD Visible satellite:%02d",gpsx.beidou_svnum%100);          //可见北斗卫星数printf("%s",dtbuf);sprintf((char *)dtbuf,"UTC Date:%04d/%02d/%02d   ",gpsx.utc.year,gpsx.utc.month,gpsx.utc.date); //显示UTC日期printf("%s",dtbuf);          sprintf((char *)dtbuf,"UTC Time:%02d:%02d:%02d   ",gpsx.utc.hour,gpsx.utc.min,gpsx.utc.sec);  //显示UTC时间printf("%s",dtbuf);
}
/* USER CODE END 0 *//*** @brief  The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 */uint16_t i,rxlen;uint16_t lenx;uint8_t key=0XFF;uint8_t upload=0;/* USER CODE END 1 *//* MCU Configuration---------  -----------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_USART1_UART_Init();MX_USART3_UART_Init();MX_TIM7_Init();/* USER CODE BEGIN 2 */KEY_Init();if(SkyTra_Cfg_Rate(5)!=0) //设置定位信息更新速度为5Hz,顺便判断GPS模块是否在位. {printf("SkyTraF8-BD Setting...");do{MX_USART3_UART_Init();;          //初始化串口3波特率为9600SkyTra_Cfg_Prt(3);          //重新设置模块的波特率为38400MX_USART3_UART_Init();;           //初始化串口3波特率为38400key=SkyTra_Cfg_Tp(100000);    //脉冲宽度为100ms}while(SkyTra_Cfg_Rate(5)!=0&&key!=0);//配置SkyTraF8-BD的更新速率为5Hzprintf("%s","SkyTraF8-BD Set Done!!");HAL_Delay(500);}/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){HAL_Delay(1);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */        if(USART3_RX_STA&0X8000)        //接收到一次数据了{rxlen=USART3_RX_STA&0X7FFF; //得到数据长度for(i=0;i<rxlen;i++)USART1_TX_BUF[i]=USART3_RX_BUF[i];      USART3_RX_STA=0;            //启动下一次接收USART1_TX_BUF[i]=0;           //自动添加结束符GPS_Analysis(&gpsx,(uint8_t*)USART1_TX_BUF);//分析字符串Gps_Msg_Show();             //显示信息  if(upload)printf("\r\n%s\r\n",USART1_TX_BUF);//发送接收到的数据到串口1}key=KEY_Scan(0);if(key==KEY0_PRES){upload=!upload;if(upload)printf("NMEA Data Upload:ON ");else printf("NMEA Data Upload:OFF");}if((lenx%500)==0)HAL_GPIO_TogglePin(GPIOB,LED0_Pin);lenx++;   }/* USER CODE END 3 */
}

这个是在main.c里面的所有程序了,自己看吧大佬们。这几天写多了有点懒(其实就是越狱看上劲了,懒- - )

3.下载验证

通过串口调试助手可以看到打印到串口的数据

然后至于WIFI的用法的话。如下

/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "stm32f4xx_it.h"
#include "common.h"
/* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD *//* USER CODE END PTD *//* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
uint8_t aTxStartMessages[] = "shiyixia\r\n";uint8_t RxBuffer[255];
uint8_t Rxbyte;
uint8_t Rx_count=0;extern  uint8_t USART3_RX_BUF[800];/* USER CODE END PD *//* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ---------------------------------------------------------*//* USER CODE BEGIN PV *//* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP *//* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 *//* USER CODE END 0 *//*** @brief  The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 */uint8_t *p;uint8_t key;uint8_t ipbuf[16];uint16_t t=999;uint8_t timex=0; uint8_t res=0;uint16_t rlen=0;uint8_t constate=0; //连接状态/* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_USART1_UART_Init();MX_USART3_UART_Init();MX_TIM7_Init();/* USER CODE BEGIN 2 */KEY_Init();/* USER CODE END 2 */printf("test\r\n");atk_8266_send_cmd("AT+CWMODE=3","OK",50);//STA+AP模式while(atk_8266_send_cmd("AT","OK",20))//检查WIFI模块是否在线{atk_8266_quit_trans();//退出透传atk_8266_send_cmd("AT+CIPMODE=0","OK",200);  //关闭透传模式  printf("未检测到模块!!!");HAL_Delay(800);printf("尝试连接模块..."); }
//  while(atk_8266_send_cmd("ATE1","OK",20));//关闭回显atk_8266_send_cmd("AT+CWMODE=2","OK",20);//AP模式atk_8266_send_cmd("AT+RST","OK",20);sprintf((char*)p,"AT+CWSAP=\"%s\",\"%s\",1,4",wifiap_ssid,wifiap_password);    //配置模块AP模式无线参数atk_8266_send_cmd(p,"OK",20);HAL_Delay(4000);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */
//      u3_printf("I'm USART3,HELLO WORLD!\r\n");atk_8266_at_response(1);//检查ATK-ESP8266模块发送过来的数据,及时上传给电脑atk_8266_send_cmd("AT+CIPMUX=1","OK",20);   //0:单连接,1:多连接sprintf((char*)p,"AT+CIPSERVER=1,%s",(uint8_t*)portnum);atk_8266_send_cmd(p,"OK",20);atk_8266_get_wanip(ipbuf);printf((char*)p,"IP地址:%s \r\n端口:%s\r\n",ipbuf,(uint8_t*)portnum);USART3_RX_STA=0;while(1){key=KEY_Scan(0);if(key==WKUP_PRES)         //WK_UP 退出测试         {  res=0;atk_8266_quit_trans();   //退出透传atk_8266_send_cmd("AT+CIPMODE=0","OK",20);   //关闭透传模式break;                                              }else if(key==KEY0_PRES) //KEY0 发送数据 {sprintf((char*)p,"ATK-8266%s测试%02d\r\n",ATK_ESP8266_WORKMODE_TBL[0],t/10);//测试数据atk_8266_send_cmd("AT+CIPSEND=0,25","OK",200);  //发送指定长度的数据HAL_Delay(200);atk_8266_send_data(p,"OK",100);  //发送指定长度的数据timex=100;    }if(USART3_RX_STA&0X8000)       //接收到一次数据了{ rlen=USART3_RX_STA&0X7FFF; //得到本次接收到的数据长度USART3_RX_BUF[rlen]=0;       //添加结束符 printf("%s\r\n",USART3_RX_BUF);   //发送到串口   sprintf((char*)p,"收到%d字节,内容如下",rlen);//接收到的字节数   USART3_RX_STA=0;if(constate!='+')t=1000;     //状态为还未连接,立即更新连接状态else t=0;                   //状态为已经连接了,10秒后再检查} if(t==1000)//连续10秒钟没有收到任何数据,检查连接是不是还存在.{constate=atk_8266_consta_check();//得到连接状态if(constate=='+')printf("连接成功");  //连接状态else printf("连接失败");         t=0;}if((t%20)==0)HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0);atk_8266_at_response(1);}}/* USER CODE END 3 */
}

好了程序在这里了,我要看剧去了,蓝牙的也是差不多的。你们可以下载了测试一下。今天先到这里

我觉得很刺激啊有没有。谢谢各位大佬,有什么不对的地方请大佬们不吝赐教喔!

欢迎转载,注明出处即可!谢谢

阿波罗STM32F429开发板关于USART3的应用(WIFI/蓝牙/GPS)相关推荐

  1. 基于RTEMS的阿波罗STM32F429开发板(正点原子)适配

    最近忙着出差也没写什么文档,先把前段时间做的一个简单的RTEMS适配过程文档发上来供大家参考. 1.文档概述 本文档主要为描述基于正点原子的阿波罗STM32F429开发板,开展RTEMS适配的过程,以 ...

  2. 正点原子阿波罗STM32F429开发板资料发布,采用底板+核心板

    正点原子阿波罗STM32F429开发板资料发布,采用底板+核心板.... https://www.amobbs.com/thread-5654611-1-1.html 正点原子STM32开发板 htt ...

  3. ESP32开发板 V1.0.0 Rev1 wifi 蓝牙4MB FLASH MicroPython

    简 介: 本文给出了对于ESP32开发板下载相关的MicroPython,使用Thony编程环境完成对于ESP32开发板的一些基础实验.详细的实验命令解释可以结合MicroPython的官方网站. 关 ...

  4. 判断按键值_ALIENTEK 阿波罗 STM32F767 开发板资料连载第七章 按键输入实验

    1)实验平台:alientek 阿波罗 STM32F767 开发板2)摘自<STM32F7 开发指南(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 第七章 按键输入实验 上 ...

  5. stm32f767中文手册_ALIENTEK 阿波罗 STM32F767 开发板资料连载第五章 SYSTEM 文件夹

    1)实验平台:alientek 阿波罗 STM32F767 开发板2)摘自<STM32F7 开发指南(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 第五章 SYSTEM 文 ...

  6. cc2530定时器和捕获比较_ALIENTEK 阿波罗 STM32F767 开发板资料连载十四章 输入捕获实验...

    1)实验平台:alientek 阿波罗 STM32F767 开发板2)摘自<STM32F7 开发指南(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 http://weixi ...

  7. fastreport masterdata每页都显示_ALIENTEK 阿波罗 STM32F767 开发板资料连载十六章 OLED 显示实验...

    1)实验平台:alientek 阿波罗 STM32F767 开发板2)摘自<STM32F7 开发指南(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 http://weixi ...

  8. c语言头文件格式图片_阿波罗 STM32F767 开发板资料连载第四十九章 图片显示实验...

    1)实验平台:alientek 阿波罗 STM32F767 开发板2)摘自<STM32F7 开发指南(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 第四十九章 图片显示实验 ...

  9. 【STM32F429开发板用户手册】第34章 STM32F429的SPI总线应用之驱动DAC8501(双路输出,16bit分辨率,0-5V)

    最新教程下载:http://www.armbbs.cn/forum.php?mod=viewthread&tid=93255 第34章       STM32F429的SPI总线应用之驱动DA ...

最新文章

  1. RocketMq 的最佳实践
  2. LaTex Extra alignment tab has been changed to \cr
  3. 自定义服务器控件ImageButton
  4. C语言stdio.h与stdlib.h的区别
  5. 全球都对HTTPS抛出了橄榄枝,为什么?你又该怎么办?
  6. 课程笔记|吴恩达Coursera机器学习 Week1 笔记-机器学习基础
  7. Qt编写Modbus从机程序
  8. Lorenz混沌系统建模与电路仿真实现
  9. 电信天翼路由器设置虚拟服务器,天翼宽带路由器设置教程
  10. c语言入门if语句(嵌套)
  11. 零基础新人如何转行做新媒体运营?
  12. 杭州云栖大会“弹性计算用户实践专场”等你来
  13. 女朋友生日,我送她网页相册,她感动的哭了(文中有惊喜)
  14. R语言 【integrate】函数
  15. 10005---海量数据排序总结
  16. stm32——中断优先级管理
  17. PIC18F45k22单片机程序文件目录存放架构
  18. 视觉感知——深度学习之YOLOv3算法
  19. 1366 mysql_Mysql错误1366
  20. RabbitMQ总结类图版

热门文章

  1. 加勒比考试委员会将向24,000名候选人发放区块链证书
  2. 七、GLib主要的事件循环(The Main Event Loop)
  3. IDA中点击apply patches to 显示 patching canceled..导致无法使用
  4. zb计算机术语,容量1zb等于多少kb
  5. u盘使用记录、痕迹删除技巧方法
  6. 产教融合-校企合作运营经验总结
  7. android手机刷ios6,管你iOS6还是WP8 市场Android强机盘点
  8. BD视觉算法工程师笔试题
  9. C#开发BIMFACE系列9 服务端API之获取应用支持的文件类型
  10. C#学习笔记(四):.net 第一个业务逻辑(同名用户不可创建)(优化逻辑)