本帖最后由 jinglixixi 于 2023-8-12 11:29 编辑
#申请原创# @21小跑堂
HC32L196配有串口通信功能,并可对相应的串口设备加以控制,如控制MP3播放模块及舵机等。
1. 控制MP3播放模块 这里所选用的MP3模块具有串口控制功能,其引脚分布如图1所示。 图1 引脚分布
其中: RX连接PA09,TX连接PA10。
多串口引脚配置的函数为: - void App_PortInit(void)
- {
- stc_gpio_cfg_t stcGpioCfg;
- DDL_ZERO_STRUCT(stcGpioCfg);
- Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE); //GPIO外设模块时钟使能
- stcGpioCfg.enDir = GpioDirOut;
- Gpio_Init(GpioPortA,GpioPin9,&stcGpioCfg);
- Gpio_SetAfMode(GpioPortA,GpioPin9,GpioAf1); //配置PA09 为UART0 TX
- stcGpioCfg.enDir = GpioDirIn;
- Gpio_Init(GpioPortA,GpioPin10,&stcGpioCfg);
- Gpio_SetAfMode(GpioPortA,GpioPin10,GpioAf1); //配置PA10 为UART0 RX
- }
对串口的初始化函数为: - void App_UartCfg(void)
- {
- stc_uart_cfg_t stcCfg;
- stc_uart_multimode_t stcMulti;
- stc_uart_baud_t stcBaud;
- DDL_ZERO_STRUCT(stcCfg);
- DDL_ZERO_STRUCT(stcMulti);
- DDL_ZERO_STRUCT(stcBaud);
- Sysctrl_SetPeripheralGate(SysctrlPeripheralUart0,TRUE); //UART0外设模块时钟使能
- stcCfg.enRunMode = UartMskMode3; //模式3
- stcCfg.enStopBit = UartMsk1bit; //1位停止位
- stcCfg.enMmdorCk = UartMskEven; //偶校验
- stcCfg.stcBaud.u32Baud = 9600; //波特率9600
- stcCfg.stcBaud.enClkDiv = UartMsk8Or16Div; //通道采样分频配置
- stcCfg.stcBaud.u32Pclk = Sysctrl_GetPClkFreq(); //获得外设时钟(PCLK)频率值
- Uart_Init(M0P_UART0, &stcCfg); //串口初始化
- Uart_ClrStatus(M0P_UART0,UartRC); //清接收请求
- Uart_ClrStatus(M0P_UART0,UartTC); //清发送请求
- Uart_EnableIrq(M0P_UART0,UartRxIrq); //使能串口接收中断
- Uart_EnableIrq(M0P_UART0,UartTxIrq); //使能串口发送中断
- }
在使用以下程序的情况下,可得到图2所示的音量与乐曲的播放指令输出。
设置音量程序: - setVolume(15);
- for(j=0;j<10;j++)
- {
- Uart_SendDataPoll(M0P_UART0,cmd6[j]);
- delay_1us(5);
- }
指定乐曲播放程序: - playn(i);
- for(j=0;j<10;j++)
- {
- Uart_SendDataPoll(M0P_UART0,cmd3[j]);
- delay_1us(5);
- }
图2 串口测试
MP3播放控制的整体电路如图3所示,稍感不足的是HC32L196是面向低功耗和低电压的,尽管它可以控制USB转TTL功能模块,但它却无法直接带动MP3播放模块,需加一级驱动才能工作。
好在MP3播放模块除了可以用串口来控制外,还可以通过GPIO口来控制。 图3 播放电路
在配合歌单的情况下,具有串口与GPIO口控制功能的MP3播放程序为: - Gpio_SetIO(STK_LED_PORT, STK_LED_PIN);
- while(1)
- {
- if(Gpio_GetInputIO(GpioPortA, GpioPin7)==0)
- {
- POINT_COLOR=RED ;
- showhanzi16(18,71+i*20,28);
- i=(i+1)%9;
- POINT_COLOR=WHITE;
- showhanzi16(18,71+i*20,28);
- playn(i);
- Gpio_ClrIO(STK_LED_PORT, STK_LED_PIN);
- for(j=0;j<10;j++)
- {
- Uart_SendDataPoll(M0P_UART0,cmd3[j]); //查询方式发送数据
- delay_1us(5);
- }
- delay1ms(200);
- Gpio_SetIO(STK_LED_PORT, STK_LED_PIN);
- delay1ms(300);
- }
- delay1ms(500);
- }
2. 控制舵机 这里所用的舵机是用来控制一个可进行双维调节的云台,共有2个舵机。 为了化简控制的难度,这里有配备了一个支持串口控制的双通道PWM调节模块,为此对电机的调节控制就转化成了串口通讯的问题。 所用的PWM调节模块,要求采用9600bps的波特率通讯,PWM的工作频率为 50Hz。 为便于调节控制,是将指令存放于指令数组中,其格式为: uint8_t MLF[7]={'S','1','F','0','5','0','T'}; uint8_t MLP[7]={'S','1','D','0','0','4','T'};
其中,数组MLF[]用于存放工作频率的设置指令,而数组MLP[]则用于存放转动角度的设置指令。
用于设置工作频率的程序为: - for(j=0;j<7;j++)
- {
- Uart_SendDataPoll(M0P_UART0,MLF[j]);
- delay_1us(5);
- }
在连接串口的情况下,其测试效果如图4所示。 图4 设置工作频率
用于角度调节的程序为: - i=3;
- while(1)
- {
- if(Gpio_GetInputIO(GpioPortA, GpioPin7)==0)
- {
- MLP[4]=i/10+'0';
- MLP[5]=i%10+'0';
- for(j=0;j<7;j++)
- {
- Uart_SendDataPoll(M0P_UART0,MLP[j]); //查询方式发送数据
- delay_1us(5);
- }
- delay1ms(500);
- i=(i+1)%13;
- if(i==0) i=3;
- }
- delay1ms(500);
- }
通过串口助手软件,其测试效果如图5所示。 图5 测试角度调节
在完成整体电路连接的情况下,其调节效果如图6至图8所示,即每按下一次用户键,则舵机就转动一个调节角度。 图6 角度调节1
图7 角度调节2
图 8角度调节3
|