STM32 启动解析,启动代码,__main main

启动代码看这里:

http://blog.csdn.net/chehlcy/article/details/5164472

在启动文件我们看到了__main和用户写的main,这2个是有区别的,大概流程如下:


1、复位第一条指令:Reset_Handler   PROC,这里指定为 LDR     R0, =__main。表示调用库函数__main,当然,我们可以在__main前做点事情,比如PLL初始化等。

2、__main()的执行流程参考:

http://www.rritw.com/a/bianchengyuyan/_NET/20120611/128129.html

跟一下汇编,大概是__scatterload()->__rt_entry()->__user_setup_stackheap()

3、最后调用用户的main()函数。

4、可以不使用C库初始化函数__main()直接调用用户的main()【或别的定义!】,这个可以google一下。



  • 4
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
下面是一个基于STM32单片机解析GNGGA数据的简单示例代码,主要使用UART串口通信接收GPS模块发送的NMEA语句,并解析其中的GNGGA语句。 ```c #include "stm32f4xx.h" #include <stdio.h> #include <stdlib.h> #include <string.h> // 定义串口接收缓冲区大小 #define RX_BUF_SIZE 256 // 定义GNGGA消息ID #define GNGGA_MSG_ID "GNGGA" // 定义GPS数据结构体 typedef struct { uint8_t hour; uint8_t minute; uint8_t second; uint8_t num_sats; float latitude; float longitude; float altitude; } gps_data_t; // 定义全局变量 static uint8_t rx_buf[RX_BUF_SIZE]; static uint8_t rx_index = 0; // 串口接收中断回调函数 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if (huart->Instance == USART1) { // 接收到一个字节,保存到接收缓冲区 rx_buf[rx_index++] = huart->Instance->DR; // 如果接收到了一条完整的NMEA语句 if (rx_buf[rx_index-1] == '\n') { // 解析GNGGA语句 if (strncmp((char*)rx_buf, "$"GNGGA_MSG_ID, strlen(GNGGA_MSG_ID)) == 0) { // 解析出GPS数据 gps_data_t gps_data; char *token = strtok((char*)rx_buf, ","); token = strtok(NULL, ","); // 跳过UTC时间 gps_data.latitude = atof(token); token = strtok(NULL, ","); if (strcmp(token, "S") == 0) { gps_data.latitude = -gps_data.latitude; } token = strtok(NULL, ","); gps_data.longitude = atof(token); token = strtok(NULL, ","); if (strcmp(token, "W") == 0) { gps_data.longitude = -gps_data.longitude; } token = strtok(NULL, ","); gps_data.num_sats = atoi(token); token = strtok(NULL, ","); gps_data.altitude = atof(token); // 处理GPS数据... } // 清空接收缓冲区 memset(rx_buf, 0, RX_BUF_SIZE); rx_index = 0; } // 启动下一次接收 HAL_UART_Receive_IT(huart, rx_buf+rx_index, 1); } } int main(void) { // 初始化系统时钟、GPIO、UART等... // ... // 启动UART接收中断 HAL_UART_Receive_IT(&huart1, rx_buf, 1); while (1) { // 处理GPS数据... } } ``` 该代码使用了STM32 HAL库,其中的HAL_UART_RxCpltCallback函数是UART接收中断回调函数,在该函数中,将接收到的字节保存到接收缓冲区rx_buf中,并判断是否接收到了一条完整的NMEA语句。如果接收到了一条完整的NMEA语句,则解析其中的GNGGA语句,提取出其中的GPS数据,并将其保存到gps_data结构体中。可以在处理GPS数据的while循环中使用这些GPS数据进行进一步的处理。 需要注意的是,由于GPS模块发送的NMEA语句可能会非常频繁地到达,因此在处理GPS数据时需要注意处理速度,以防止数据丢失或延迟。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值