8H2K17U 出现两个问题。
现在使用8H2K17U出现两个问题,一个是上电后串口不通讯,怀疑是内部晶振一开始没有工作,现象是通过上位机发送数据给单片机没有任何反应,另一个问题是写入EEPROM内部数据,再次读取时个别数据就会发生变化。也可能是你工作频率和串口波特率这里不匹配, 导致串口不能正确接收你的数据,也就无从返回了。 有这种可能,怎么保证工作频率与串口频率呢? 还有就是重新上电,这些症状就有可能消失,出现的几率不是很大,怎么解决呢?
缺少程序 这就上传
//========================================================================
// 函数: void UART_config(void)
// 描述: AD初始化
// 参数: None.
// 返回: None.
// 版本: V1.0, 2020-09-28
//========================================================================
void UART_config(void)
{
COMx_InitDefine COMx_InitStructure; //结构定义
P1_MODE_IO_PU(GPIO_Pin_0|GPIO_Pin_1); //P1.0,P1.1 设置为准双向口
COMx_InitStructure.UART_Mode = UART_8bit_BRTx; //模式, UART_ShiftRight,UART_8bit_BRTx,UART_9bit,UART_9bit_BRTx
// COMx_InitStructure.UART_BRT_Use = BRT_Timer2; //选择波特率发生器, BRT_Timer2 (注意: 串口2固定使用BRT_Timer2, 所以不用选择)
COMx_InitStructure.UART_BaudRate= 9600ul; //波特率, 110 ~ 115200
COMx_InitStructure.UART_RxEnable= ENABLE; //接收允许, ENABLE或DISABLE
UART_Configuration(UART2, &COMx_InitStructure); //初始化串口2 USART1,USART2,USART3,USART4
NVIC_UART2_Init(ENABLE,Priority_1); //中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
UART2_SW(UART2_SW_P10_P11);
}
void TX2_write2buff(u8 dat) //写入发送缓冲,指针+1
{
S2BUF = dat;
COM2.B_TX_busy = 1; //标志忙
while(COM2.B_TX_busy);
}
void UART2_ISR_Handler (void) interrupt UART2_VECTOR
{
if(RI2)
{
CLR_RI2();
if(COM2.B_RX_OK == 0)
{
RX2_Buffer = S2BUF;
if(COM2.RX_Cnt >= 8)
{
UsartData.u8_RecFlag = 1;
COM2.RX_Cnt = 0;
}
COM2.RX_TimeOut = TimeOutSet2;
}
}
if(TI2)
{
CLR_TI2();
COM2.B_TX_busy = 0;
// if(COM2.TX_read != COM2.TX_write)
// {
// S2BUF = TX2_Buffer;
// if(++COM2.TX_read >= COM_TX2_Lenth) COM2.TX_read = 0;
// }
// else COM2.B_TX_busy = 0;
}
} 这是EEPROM写入数据函数
void FLASH_WriteNWord(uint16 ReadAddress, uint8 *WriteData, uint16 ReadNum)
{
EEPROM_SectorErase(ReadAddress);
delay_ms(10);
EEPROM_write_n(ReadAddress, WriteData, ReadNum);
}
void EEPROM_SectorErase(u16 EE_address)
{
IAP_ENABLE(); //设置等待时间,允许IAP操作,送一次就够
IAP_ERASE(); //宏调用, 送扇区擦除命令,命令不需改变时,不需重新送命令
//只有扇区擦除,没有字节擦除,512字节/扇区。
//扇区中任意一个字节地址都是扇区地址。
IAP_ADDRH = EE_address / 256; //送扇区地址高字节(地址需要改变时才需重新送地址)
IAP_ADDRL = EE_address % 256; //送扇区地址低字节
EEPROM_Trig(); //触发EEPROM操作
DisableEEPROM(); //禁止EEPROM操作
}
void EEPROM_write_n(u16 EE_address,u8 *DataAddress,u16 number)
{
IAP_ENABLE(); //设置等待时间,允许IAP操作,送一次就够
IAP_WRITE(); //宏调用, 送字节写命令
do
{
IAP_ADDRH = EE_address / 256; //送地址高字节(地址需要改变时才需重新送地址)
IAP_ADDRL = EE_address % 256; //送地址低字节
IAP_DATA= *DataAddress; //送数据到IAP_DATA,只有数据改变时才需重新送
EEPROM_Trig(); //触发EEPROM操作
EE_address++; //下一个地址
DataAddress++; //下一个数据
}while(--number); //直到结束
DisableEEPROM();
}
读出数据
void FLASH_ReadNWord(uint16 ReadAddress, uint8 *ReadBuf, uint16 ReadNum)
{
EEPROM_read_n(ReadAddress, ReadBuf, ReadNum);
}
void EEPROM_read_n(u16 EE_address,u8 *DataAddress,u16 number)
{
IAP_ENABLE(); //设置等待时间,允许IAP操作,送一次就够
IAP_READ(); //送字节读命令,命令不需改变时,不需重新送命令
do
{
IAP_ADDRH = EE_address / 256; //送地址高字节(地址需要改变时才需重新送地址)
IAP_ADDRL = EE_address % 256; //送地址低字节
EEPROM_Trig(); //触发EEPROM操作
*DataAddress = IAP_DATA; //读出的数据送往
EE_address++;
DataAddress++;
}while(--number);
DisableEEPROM();
} 269698226 发表于 2024-12-24 15:25
有这种可能,怎么保证工作频率与串口频率呢?
下载程序的时候把频率设置好
初始化程序,用下载软件进行初始化 你的这种建议只适合在实验室使用
页:
[1]