本帖最后由 springvirus 于 2019-6-9 14:57 编辑
整个系统用到了M058S的UART0(用于与NUC472通讯),ADC0-ADC3 和4路IO控制LED,一路IO使用状态机识别拨动开关,定时器设置为1ms溢出,用于状态机和LED IO定时取反的闪烁效果,多路IO驱动12864屏
NUC472的UART0(用于打印) UART1(用于与M058S通讯) ADC0 一路IO控制LED 定时器设置为1ms溢出,用于接收超时的计数器和LED IO定时取反的闪烁效果
上传主流程代码
M058S端的main.c
NUC472端的主流程函数
void vM058SMonitorTask(void)
//实时监控M058S的运行状态
{
uint8_t uret8;
uint8_t rbuf[30];
uint32_t rlen = 0;
u32 temp[4] = {0x00};
union sv_32 temp_union_32;
union sv_16 temp_union_16;
u32 led_timer[4] = 0;
u32 master_trace_timer = 0;
u32 slave_trace_timer = 0;
#if 1
while(1)
{
process_uart1_recv_packet_from_M058S(rbuf, &rlen);
//M058S 500ms 发送1包
//若收不到数据包,超时2s后,就升主
if(checktimer(&m058s_local_no_pack_timer, 2000))
{
m058s_local_clear_no_pack_timer();
//超时升主
nuc472_master_flag = 1;
trace("&&&&&&&&&&&&&&&&&&& \r\n");
trace("no M058S data, timeout !!! \r\n");
}
#if 1
if(nuc472_master_flag == 1)
//是主机,就采集4路ADC,并发送显示
{
//adc check();
led_output();
//简化,从机升主后只采集一路ADC
temp[0] = (i32ConversionData[0]*5000)/4096;
//temp[1] = (i32ConversionData[1]*5000)/4096;
//temp[2] = (i32ConversionData[2]*5000)/4096;
//temp[3] = (i32ConversionData[3]*5000)/4096;
if(checktimer(&master_trace_timer, 1000))
{
trace("################################# \r\n");
trace("no m058s data !! is master now !! \r\n");
trace("adc_0 = %d \r\n", temp[0]);
//trace("adc_1 = %d \r\n", temp[1]);
//trace("adc_2 = %d \r\n", temp[2]);
//trace("adc_3 = %d \r\n", temp[3]);
}
if((temp[0] >= 0) && (temp[0] <= 1500))
{
//led off
led_1_off();
}
else if((temp[0] >= 1511) && (temp[0] <= 3500))
{
//led toggle
if(checktimer(&led_timer[0], 333))
{
led_1_toggle();
}
}
else if((temp[0] >= 3511) && (temp[0] <= 5000))
{
//led on
led_1_on();
}
//----------------
}
else if(nuc472_master_flag == 0)
//是备机,就显示接收到的
{
led_high_impedance();
if(checktimer(&slave_trace_timer, 1000))
{
trace("################################# \r\n");
trace("recv m058s data !! is slave now !! \r\n");
temp_union_16.c[0] = rbuf[DATA];
temp_union_16.c[1] = rbuf[DATA+1];
trace("adc_0 = %d \r\n", temp_union_16.Val);
temp_union_16.c[0] = rbuf[DATA+2];
temp_union_16.c[1] = rbuf[DATA+3];
trace("adc_1 = %d \r\n", temp_union_16.Val);
temp_union_16.c[0] = rbuf[DATA+4];
temp_union_16.c[1] = rbuf[DATA+5];
trace("adc_2 = %d \r\n", temp_union_16.Val);
temp_union_16.c[0] = rbuf[DATA+6];
temp_union_16.c[1] = rbuf[DATA+7];
trace("adc_3 = %d \r\n", temp_union_16.Val);
trace("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& \r\n");
trace("led status, 0:off, 1:toggle, 2:on \r\n");
trace("led_1 = %d \r\n", rbuf[DATA+8]);
trace("led_2 = %d \r\n", rbuf[DATA+9]);
trace("led_3 = %d \r\n", rbuf[DATA+10]);
trace("led_4 = %d \r\n", rbuf[DATA+11]);
}
}
#endif
}
#endif
}
|