gpt4 book ai didi

c - STM32调试时的不同结果

转载 作者:太空宇宙 更新时间:2023-11-04 04:44:55 24 4
gpt4 key购买 nike

我正在尝试使用 UART 在 1-Wire 上对数字温度计 DS18B20 进行编程,但我遇到了奇怪的问题。当我调试这个运行时没有断点的程序(或者只是运行没有调试的程序)时,我的读数约为 100°C。当我在接收温度信息之前放置断点时,它给我大约 50°c。第三个选项,当我打开这个窗口时,我可以看到 SFR 并展开 UART4 部分,它会为我提供大约 25°C 的正确读数。我有 Saleae 逻辑分析仪,在所有这 3 种情况下,它都会向我发送有效数据(大约 25°C)。我试图在断点所在的地方设置一些延迟(甚至延迟 2 秒),但没有帮助。它给了我大约 50°C 的读数(比如有断点和未扩展的 SFR 窗口)。这可能是编程错误(我正在开始),但这种带有扩展 SFR 窗口的操作超出了我的推理范围。我真的不知道发生了什么。我希望你能为我阐明这种情况。

我正在使用 STM32F4-Discovery 评估板并在 Atollic 4.1.0 上对其进行编程。

我的“库”文件:

#include "DS18B20_Lib.h"


void DS18B20_Init(void)
{
//USART4 PA0
GPIO_InitTypeDef GS;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4,ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource0,GPIO_AF_UART4);

GS.GPIO_Mode = GPIO_Mode_AF;
GS.GPIO_OType = GPIO_OType_PP;
GS.GPIO_PuPd = GPIO_PuPd_UP;
GS.GPIO_Speed = GPIO_Speed_50MHz;
GS.GPIO_Pin = GPIO_Pin_0;
GPIO_Init(GPIOA,&GS);

USART_InitTypeDef US;
US.USART_BaudRate = 115200;
US.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
US.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
US.USART_Parity = USART_Parity_No;
US.USART_StopBits = USART_StopBits_1;
US.USART_WordLength = USART_WordLength_8b;
USART_Init(UART4,&US);
USART_SetAddress(UART4,0x12);
USART_Cmd(UART4,ENABLE);
USART_HalfDuplexCmd(UART4,ENABLE);

USART_ITConfig(UART4,USART_IT_TXE | USART_IT_RXNE | USART_IT_TC ,ENABLE);
/*NVIC_InitTypeDef NS;
NS.NVIC_IRQChannel = UART4_IRQn;
NS.NVIC_IRQChannelCmd = ENABLE;
NS.NVIC_IRQChannelPreemptionPriority = 1;
NS.NVIC_IRQChannelSubPriority = 1;
NVIC_Init(&NS);*/

}

uint16_t Reset_1Wire(void)
{
uint16_t Present;
while (USART_GetFlagStatus(UART4, USART_FLAG_TC) == RESET);
UART4->BRR = 0x1117;
while (USART_GetFlagStatus(UART4, USART_FLAG_TXE) == RESET);
USART_SendData(UART4,0xF0);
while (USART_GetFlagStatus(UART4, USART_FLAG_RXNE) == RESET);
Present = USART_ReceiveData(UART4);
while (USART_GetFlagStatus(UART4, USART_FLAG_TC) == RESET);
UART4->BRR = 0x016D;
return Present;
}

char Read_1Wire(void)
{

char Data=0;
int i;
for(i=0;i<8;i++)
{
while (USART_GetFlagStatus(UART4, USART_FLAG_TXE) == RESET);
USART_SendData(UART4,0xFF);
while (USART_GetFlagStatus(UART4, USART_FLAG_RXNE) == RESET);
if(USART_ReceiveData(UART4)==0xFF)
Data|=0x80;
else Data|=0;
if (i!=7) Data=Data>>1;
}
return Data;
}

void Write_1Wire(char Data)
{
char Mask=1;
int i;
for(i=0;i<8;i++)
{
while (USART_GetFlagStatus(UART4, USART_FLAG_TXE) == RESET);
if (Data & Mask)
USART_SendData(UART4,0xFF);
else
USART_SendData(UART4,0x00);
Mask=Mask<<1;
}
}

uint16_t DS18B20_MeasTemp(void)
{
uint16_t Data;
uint16_t LSB;
uint16_t MSB;
Reset_1Wire();
Write_1Wire(0xCC); //SkipRom only 1 device
Write_1Wire(0x44);
while(Read_1Wire()==0x00);
Reset_1Wire();
Write_1Wire(0xCC);
Write_1Wire(0xBE);
/*--------BRAKEPOINT HERE--------*/
LSB=Read_1Wire();
MSB=Read_1Wire();
Data=MSB<<8|LSB;
Reset_1Wire();
return Data;
}

还有我的主要功能:

int main(void)
{
char strLine[25];
uint16_t Temperature;

LCD_Init();
LCD_SetColors(GREEN, BLUE);
LCD_Clear(BLUE);
LCD_CharSize(16);

DS18B20_Init();

sprintf(strLine,"%s","Temp: ");
LCD_StringLine(20,50,(uint8_t*) strLine);
//GPIO_Config();
while (1)
{
Presence1Wire();
Temperature = DS18B20_MeasTemp();
if (Temperature&0xF000)
LCD_PutChar(60,50,'-');
else LCD_PutChar(60,50,'+');
LCD_PutInt(68,50,(Temperature&0x0FF0)>>4);
LCD_PutInt(72,64,(Temperature&0xF)*625);
}

}

最佳答案

Write_1Wire(0xCC);
Write_1Wire(0xBE);
  • 向 UART 发送字节但不读取。在 fifo 中接收数据。
Read_1Wire()
  • 读取 fifo 中的旧数据。
uint16_t DS18B20_MeasTemp(void)
{
uint16_t Data;
uint16_t LSB;
uint16_t MSB;
Reset_1Wire();
Write_1Wire(0xCC); //SkipRom only 1 device
Write_1Wire(0x44);
while(Read_1Wire() == 0x00);
Reset_1Wire();
Write_1Wire(0xCC);
Write_1Wire(0xBE);
/*--------BRAKEPOINT HERE--------*/
// !!!!!!! Paste this
while (USART_GetFlagStatus(UART4, USART_FLAG_RXNE) != RESET)
USART_ReceiveData(UART4);
// !!!!!!!
LSB = Read_1Wire();
MSB = Read_1Wire();
Data = MSB << 8 | LSB;
Reset_1Wire();
return Data;
}

关于c - STM32调试时的不同结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22211883/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com