269698226 发表于 2024-12-24 14:57:03

8H2K17U 出现两个问题。

现在使用8H2K17U出现两个问题,一个是上电后串口不通讯,怀疑是内部晶振一开始没有工作,现象是通过上位机发送数据给单片机没有任何反应,另一个问题是写入EEPROM内部数据,再次读取时个别数据就会发生变化。

_奶咖君_ 发表于 2024-12-24 15:16:31

也可能是你工作频率和串口波特率这里不匹配, 导致串口不能正确接收你的数据,也就无从返回了。

269698226 发表于 2024-12-24 15:25:20

有这种可能,怎么保证工作频率与串口频率呢?

269698226 发表于 2024-12-24 15:26:38

还有就是重新上电,这些症状就有可能消失,出现的几率不是很大,怎么解决呢?

DebugLab 发表于 2024-12-24 15:29:12

缺少程序

269698226 发表于 2024-12-24 15:32:18

这就上传
//========================================================================
// 函数: 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;
        }
}

269698226 发表于 2024-12-24 15:36:10

这是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();
}

欢迎哈哈哈3 发表于 2024-12-24 16:10:34

269698226 发表于 2024-12-24 15:25
有这种可能,怎么保证工作频率与串口频率呢?

下载程序的时候把频率设置好
初始化程序,用下载软件进行初始化

269698226 发表于 2024-12-24 16:27:14

你的这种建议只适合在实验室使用
页: [1]
查看完整版本: 8H2K17U 出现两个问题。