【可能是东半球最好的stm32入门教学】第1章 环境配置

在嵌入式开发中,外设的初始化往往不是重点。以往的标准库教程虽有助于理解和熟悉芯片的寄存器功能,但是对于很多初学者,在入门阶段就学习这些较难的知识反而减少了他们的学习兴趣。那么有没有一个软件可以用图形化的界面完成芯片的初始化?这就是由STM32官方出品的STM32cubeMX软件,它能让原本复杂的外设初始化操作变得简单易懂,大大降低了开发难度。本教程将详细介绍如何安装和配置 STM32 开发环境,下面就跟着我的步伐开始吧。

一、准备工作
提前下载好以下安装包:

  1. Keil MDK 官方下载
  2. STM32cubeMX 官方下载
  3. vscode 官方下载

因为这些软件的下载服务器在国外,国内下载时速度很慢。
推荐关注我的公众号【空集合】,回复【stm32】获取所有需要的软件高速下载链接,而且会同步官网更新版本。
同时回复【交流群】可获取入群信息,群内有众多嵌入式小伙伴可以交流探讨技术问题。

二、安装 Keil MDK
Keil MDK 是一款功能强大的集成开发环境(IDE),适用于 ARM 处理器。下面是安装步骤:
推荐看这个教程

三、安装 STM32CubeMX
STM32CubeMX 是一款用于配置 STM32 微控制器的图形化工具,能生成初始化代码。
下载网盘里的文件后正常安装即可。

四、安装vscode
Keil的优势在于强大的编译和调试功能,但是在编辑代码时,糟糕的体验让人很难相信他是2024年的产品。包括代码经常无法补全,缺少常见快捷键操作,难用的代码跳转功能等等。
恰好vscode作为一款编辑器他的优势整合能弥补Keil的不足。
所有我们可以安装vscode,然后安装“Keill Assistant”插件,就能够在vscode中编辑和编译工程代码了,编程体验相比于keil有了很大的提升。

安装完成vscode后,在插件商店中搜索“Keill Assistant” Keil插件
安装完成后能够看到侧边栏多了一行
在这里插入图片描述
同时为了能够补全C语言代码,我们还需要安装以下插件:
C语言插件
下节课教大家如何利用STM32cubeMX不写一行代码完成外设初始化,以及如何在vscode中编辑keil工程。我们下期再见!
有任何疑问欢迎关注公众号【空集合】,回复【交流群】来找到我们,帮助你解答遇到的问题!

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的示例代码,用于连接STM32F103C8T6和EC01G,并使用AT指令获取GPS位置并解析数据: ```c #include "stm32f10x.h" #include <stdio.h> #include <string.h> #define GPS_BUFFER_LEN 256 char GPS_Buffer[GPS_BUFFER_LEN]; uint16_t GPS_Buffer_Index = 0; void USART1_IRQHandler(void) { if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { char ch = USART_ReceiveData(USART1); if (GPS_Buffer_Index < GPS_BUFFER_LEN - 1) { GPS_Buffer[GPS_Buffer_Index++] = ch; } if (ch == '\n') { GPS_Buffer[GPS_Buffer_Index] = '\0'; // 解析GPS数据 if (strstr(GPS_Buffer, "$GPGGA")) { char* p = strtok(GPS_Buffer, ","); int i = 0; while (p != NULL) { switch (i++) { case 2: // 纬度 { float lat = atof(p + 2) / 60.0f + atof(p) * 100.0f / 60.0f; printf("Latitude: %.6f\r\n", lat); break; } case 3: // 纬度半球 { printf("Latitude direction: %c\r\n", *p); break; } case 4: // 经度 { float lon = atof(p + 3) / 60.0f + atof(p) * 100.0f / 60.0f; printf("Longitude: %.6f\r\n", lon); break; } case 5: // 经度半球 { printf("Longitude direction: %c\r\n", *p); break; } case 6: // GPS状态 { printf("GPS status: %c\r\n", *p); break; } } p = strtok(NULL, ","); } } GPS_Buffer_Index = 0; } } } void USART1_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); USART_Cmd(USART1, ENABLE); } void EC01G_Send_AT_Command(char* command) { while (*command) { USART_SendData(USART1, *command++); while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); } USART_SendData(USART1, '\r'); while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); USART_SendData(USART1, '\n'); while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); } void EC01G_Init(void) { EC01G_Send_AT_Command("AT+CGNSPWR=1"); EC01G_Send_AT_Command("AT+CGNSSEQ=\"RMC\""); EC01G_Send_AT_Command("AT+CGNSTST=1"); } int main(void) { USART1_Init(); EC01G_Init(); while (1) { // 定期发送AT指令获取GPS位置 EC01G_Send_AT_Command("AT+CGNSINF"); delay_ms(1000); } } ``` 注意,这只是一个示例代码,可能需要根据你的具体硬件和需求进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值