HC32L110的串口不定长接收及PCA和IRQ的部分问题

show you the code:

https://gitee.com/yangfei_addoil/hc32-l110-b6-test

另:程序中使用帕斯卡命名法的是从官方例程上复制的;使用下划线命名法的是博主的;

串口不定长接收

注意串口要自己绑定/指定到一个定时器上;

代码库中没有借助定时器实现了一个简易的console,具体的接口可以自己补充,目前有gpio控制和adc获取两个简单的实例。

主要的两个函数如下(原谅我使用了全局变量,这个单片机空间不大,就没搞太复杂):

/**
  * @brief 简易测试控制台.
  * @note
  * @param *data 交互数据的存放缓存区
  *
  * @retval 0:设置成功 1:设置/读取失败
  * @author yangFei
  * @date   20230814
  * @note   目前没有做数据范围判断,所以可能有异常
  */
uint8_t test_console(char *data)
{
    char temp[20];

    if (strstr(data, "get dac"))  //获取电阻
    {
			  int dac = adc_get[0] + adc_get[1];
			  printf("data: %d\n", dac);
    }
		else if (strstr(data, "gpio"))  //gpio 设置
    {
        uint32_t  io1, io2;
        sscanf((char *)data, "%s %d %d", temp, &io1, &io2);
			  Gpio_SetIO(1, 4, io1);
        Gpio_SetIO(1, 5, io2);
        printf("gpio: %d %d\n", io1, io2);
    }
    else if (strstr(data, "other"))
    {
        __NOP;
    }
    else
    {
        printf("order list:\n");
        printf("get dac\n");
			  printf("gpio\n");
			  printf("other\n");

        return 1;

    }


    return 0;
}

/**
    * @brief  获取串口0接收的内容
    *
    * @param  uart0_data:串口0结果指针; uart0_data_len:读取的长度
    *
    * @retval 1:有数据更新;0:无数据更新
    * @author yangFei
    * @date   20230814
    * @note   使用单字符队列+延时的方式;uart0_data_len不能超过最大长度
    */
uint8_t get_uart0_data(uint8_t *uart0_data, uint8_t uart0_data_len)
{
    if (uart0_rx_flag == 0 || uart0_data_len > 16)
    {
        return 0;
    }
    else
    {

        delay1ms(UART0_RX_LEN);//等待帧接收完成
        memcpy(uart0_data, uart0_rx_data, uart0_data_len);

        //清空队列和标志位
        memset(uart0_rx_data, 0, sizeof(uart0_rx_data));
        uart0_rx_pos = 0;
        uart0_rx_flag = 0;

        return 1;
    }
}

PCA

IRQ

GPIO的中断不能交变沿检测,只能上升或下降沿触发;

如下图,从触发中断到芯片进入中断,时间是67us

 手册解释如下(目前使用的内部24M晶振,等待16个周期):

猜你喜欢

转载自blog.csdn.net/Fei_Yang_YF/article/details/132367286