打印
[STM32F4]

程序只在仿真时才正常

[复制链接]
121|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
石榴大王|  楼主 | 2025-4-6 22:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 石榴大王 于 2025-4-6 22:27 编辑

项目中使用 STM32CubeIDe进行开发, STM32F030 作为发送端,STM32F4 作为接收端。
在仿真模式下运行程序时,它们都正常工作,能正常接受数据。但是当停止仿真后,在接收机中看不到任何数据。
一下是代码

#include "main.h" //buraya don#include "stm32f0xx_hal.h"

#include "dht22.h"
uint8_t nem_byte1, nem_byte2, sicaklik_byte1, sicaklik_byte2,checksum, verilerin_toplami;uint16_t  nem, sicaklik,sicaklik1,nem1,timer_sayac_degeri;  void delay_ticks(uint32_t ticks) { //SYSTICK TIMER 24 BIT     SysTick->LOAD = ticks; //girilen süre için gerekli tick sayısı     SysTick->VAL = 0;     SysTick->CTRL = SysTick_CTRL_ENABLE_Msk;     SysTick->CTRL &= ~SYSTICK_CLKSOURCE_HCLK_DIV8;     SysTick->CTRL |= SYSTICK_CLKSOURCE_HCLK;     //COUNTFLAG,counter 0 oldugunda 1 oluyo.     //okundugunda otomatik oalrak temizleniyo     while ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == 0);     SysTick->CTRL = 0; } void delay_us(uint32_t us){
    delay_ticks(us * 8);} static inline void delay_ms(uint32_t ms) {     delay_ticks(ms * 8000); } GPIO_InitTypeDef GPIO_InitStruct = {0}; void pini_giris_yap (void)  {
  GPIO_InitStruct.Pin = GPIO_PIN_5;  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;  GPIO_InitStruct.Pull = GPIO_NOPULL;  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);  }   /*Configure GPIO pin : PA2 */  void pini_cikis_yap (void)  {  GPIO_InitStruct.Pin = GPIO_PIN_5;  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;  GPIO_InitStruct.Pull = GPIO_NOPULL;  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);  }  void DHT22_baslat (void){        pini_cikis_yap();        HAL_GPIO_WritePin (GPIOA, GPIO_PIN_5, 0);   // baslangica sinyali        delay_us(1100);        HAL_GPIO_WritePin (GPIOA, GPIO_PIN_5, 1);   // sensorden gelecek cevabi bekle        delay_us(30);        pini_giris_yap();} void sensorden_yanit_al (void){
         delay_us(120); //datasheete gore 80-160 arasi bir deger        while ((HAL_GPIO_ReadPin (GPIOA, GPIO_PIN_5)));} uint8_t veri_oku(void){        uint8_t i,j;        for (j=0;j<8;j++)        {                while (!(HAL_GPIO_ReadPin (GPIOA, GPIO_PIN_5)));   // pin 1 olana keder bekle                delay_us(40);   // 50 yapinca calismiyo
                if ((HAL_GPIO_ReadPin (GPIOA, GPIO_PIN_5)) == 0)                {                        i&= ~(1<<(7-j));   // alinan bit 0

                }                else i|= (1<<(7-j));  // alinan bit 1
                 while (HAL_GPIO_ReadPin (GPIOA, GPIO_PIN_5 && ((TIM3->CNT-timer_sayac_degeri)==1600) )); //problem olursa 200 us sonra devam et        }        return i;}  void oku(void){DHT22_baslat ();        sensorden_yanit_al ();        nem_byte1 = veri_oku();        nem_byte2 = veri_oku();        sicaklik_byte1 = veri_oku();        sicaklik_byte2 = veri_oku();        checksum = veri_oku();// check-sum should be the last 8 bit of "8 bit integral RH data+8 bit decimal RH        //data+8 bit integral T data+8 bit decimal T data".          verilerin_toplami=(nem_byte1+nem_byte2+sicaklik_byte1+sicaklik_byte2);        //                 HAL_UART_Transmit(&huart1,(uint8_t*)"resul\r\n",sizeof("resul\r\n")-1,100);         if ((checksum) == verilerin_toplami)        {        sicaklik = ((sicaklik_byte1<<8)|sicaklik_byte2);        nem = ((nem_byte1<<8)|nem_byte2);         } }

使用特权

评论回复
沙发
公羊子丹| | 2025-4-7 07:25 | 只看该作者
感觉像是你用到了 SysTick 做延时,仿真时工作正常,但实际运行中主循环可能没跑起来。你有确认 SysTick 初始化正确了吗?

使用特权

评论回复
板凳
周半梅| | 2025-4-7 07:26 | 只看该作者
STM32F4 在 release 模式下优化会影响 delay 精度,特别是你这个用裸 SysTick 延时的方式。可以试试在 debug 和 release 模式下加 volatile 看看。

使用特权

评论回复
地板
帛灿灿| | 2025-4-7 07:27 | 只看该作者
看起来你用的 GPIOA_PIN_5,确认下是不是板子上这个引脚没被其他外设占用?

使用特权

评论回复
5
童雨竹| | 2025-4-7 07:28 | 只看该作者
有时候仿真模式下时钟初始化是 IDE 自动帮你设置的,但脱离仿真后就没有了,你可以检查下时钟系统有没有跑起来。

使用特权

评论回复
6
万图| | 2025-4-7 07:29 | 只看该作者
有没有试过加个 UART 打印,在程序开头输出个标志字符串,确认 MCU 在不仿真时是否真的在跑?

使用特权

评论回复
7
Wordsworth| | 2025-4-7 07:30 | 只看该作者
你这段 delay 是自己写的 SysTick 延时逻辑,可能存在系统频率没设置对导致 delay 不准的问题。建议你试试用 HAL_Delay 先验证。

使用特权

评论回复
8
Bblythe| | 2025-4-7 07:32 | 只看该作者
感觉像是主程序没进去,也可能是 HAL_Init() 或 SystemClock_Config() 有问题,建议你在 main() 里加点 log 或 LED 闪烁看看。

使用特权

评论回复
9
Pulitzer| | 2025-4-7 07:33 | 只看该作者
你可以试试在 STM32F4 那边加个 scope 看看实际 GPIO 波形有没有出来,也许发送是正常的,只是接收延时不对。

使用特权

评论回复
10
Uriah| | 2025-4-7 07:34 | 只看该作者
还有个思路是看看是不是仿真时用的是 SWV 或 debug console 代替串口了,脱仿真后实际串口没配置好。

使用特权

评论回复
11
Clyde011| | 2025-4-7 07:35 | 只看该作者
之前我遇到过类似情况是 option bytes 设置了 BOOT1,脱离仿真后从错误的地址启动了,也可以查查这块。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

8

帖子

0

粉丝