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个周期):