[ZLG-MCU] 8962在使用软复位指令之后串口会产生乱码

[复制链接]
2809|2
 楼主| hhtek 发表于 2008-2-16 20:31 | 显示全部楼层 |阅读模式
#include&nbsp;&quot;hh_uart.h&quot;&nbsp;<br />#include&nbsp;&quot;hh_led.h&quot;<br />#include&nbsp;&quot;hh_watchdog.h&quot;<br />#include&nbsp;&quot;hh_timer.h&quot;<br /><br />void&nbsp;SoftTimerFunction1(void);<br /><br />int&nbsp;main(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;len,cmd[16];<br />&nbsp;&nbsp;unsigned&nbsp;long&nbsp;ulResetCause;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;SysCtlClockSet(SYSCTL_SYSDIV_1&nbsp;|&nbsp;SYSCTL_USE_OSC&nbsp;|&nbsp;SYSCTL_OSC_MAIN&nbsp;|&nbsp;SYSCTL_XTAL_6MHZ);<br />&nbsp;&nbsp;&nbsp;&nbsp;//分频系数为1,使用外部晶体作为主振荡器,且晶体的频率为6M<br />&nbsp;&nbsp;&nbsp;&nbsp;delay(2000000);<br />&nbsp;&nbsp;&nbsp;&nbsp;LEDInit();<br />&nbsp;&nbsp;WDTInit();<br />&nbsp;&nbsp;IntEnable(INT_GPIOA);&nbsp;&nbsp;//允许GPIOA中断<br />&nbsp;&nbsp;UART0Init();<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;TimerInit();<br />&nbsp;&nbsp;InitSoftTimer();/*&nbsp;初始化软定时器模块&nbsp;*/<br />&nbsp;&nbsp;SoftTimerRun(0,TICKS_PER_SEC&nbsp;/&nbsp;2,SoftTimerFunction1);&nbsp;/*&nbsp;运行两个软定时器&nbsp;*/&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;while(1){<br />&nbsp;&nbsp;&nbsp;&nbsp;ulResetCause=SysCtlResetCauseGet();<br />&nbsp;&nbsp;&nbsp;&nbsp;SysCtlResetCauseClear(ulResetCause);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(ulResetCause&nbsp;&&nbsp;SYSCTL_CAUSE_SW){//软件复位<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LED4On();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UART0_put_str(&quot;SYSCTL_CAUSE_SW\r\n\r\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;}else&nbsp;if(ulResetCause&nbsp;&&nbsp;SYSCTL_CAUSE_WDOG){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LED5On();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UART0_put_str(&quot;SYSCTL_CAUSE_WDOG\r\n\r\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;}else&nbsp;if(ulResetCause&nbsp;&&nbsp;SYSCTL_CAUSE_EXT){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LED6On();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UART0_put_str(&quot;&gt----------\r\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UART0_put_str(&quot;&gt请选择:\r\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UART0_put_str(&quot;&gt1&nbsp;软复位\r\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UART0_put_str(&quot;&gt2&nbsp;将看门狗中断等级提高到最高\r\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UART0_put_str(&quot;&gt3&nbsp;将看门狗中断等级降低到最低\r\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UART0_put_str(&quot;&gt4&nbsp;停止外设定时器0\r\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UART0_put_str(&quot;&gt5&nbsp;启动外设定时器0\r\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UART0_put_str(&quot;&gt6&nbsp;软件触发GPIOA中断,进入死循环\r\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UART0_put_str(&quot;&gt----------\r\n\r\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UART0_put_str(&quot;SYSCTL_CAUSE_EXT\r\n\r\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;}else&nbsp;if(ulResetCause&nbsp;&&nbsp;SYSCTL_CAUSE_POR){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UART0_put_str(&quot;SYSCTL_CAUSE_POR\r\n\r\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if((len=UART0_get_line(cmd,13))&gt0){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(len&gt3)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UART0_put_str(&quot;&gt&nbsp;command&nbsp;you&nbsp;entered&nbsp;is:&nbsp;&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UART0_put_str(cmd);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UART0_put_str(&quot;&gt&nbsp;this&nbsp;is&nbsp;too&nbsp;long!&nbsp;\r\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch(cmd[0]){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;'1':<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UART0_put_str(&quot;&gtthe&nbsp;command&nbsp;is&nbsp;soft&nbsp;reset\r\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delay(2000000);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SysCtlReset();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;'2':<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UART0_put_str(&quot;promote&nbsp;watchdog&nbsp;interrupt&nbsp;priority&nbsp;to&nbsp;top&nbsp;1\r\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IntPrioritySet(INT_WATCHDOG,1&lt&lt5);//最高优先级<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;'3':<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UART0_put_str(&quot;bring&nbsp;down&nbsp;watchdog&nbsp;interrupt&nbsp;priority&nbsp;to&nbsp;lowest\r\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IntPrioritySet(INT_WATCHDOG,7&lt&lt5);//最低优先级<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;'4':<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UART0_put_str(&quot;the&nbsp;command&nbsp;is&nbsp;stop&nbsp;timer0&nbsp;Peripheral\r\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TimerDisable(TIMER0_BASE,&nbsp;TIMER_A);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;'5':<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UART0_put_str(&quot;the&nbsp;command&nbsp;is&nbsp;restart&nbsp;timer0&nbsp;Peripheral\r\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TimerEnable(TIMER0_BASE,&nbsp;TIMER_A);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;'6':<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UART0_put_str(&quot;the&nbsp;command&nbsp;is&nbsp;soft&nbsp;GPIOA&nbsp;endless&nbsp;loop\r\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HWREG(NVIC_SW_TRIG)=INT_GPIOA-16;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default&nbsp;:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UART0_put_str(&quot;&gtunkown&nbsp;command\r\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}<br />}<br /><br />void&nbsp;SoftTimerFunction1(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;GPIOPinWrite(GPIO_PORTB_BASE,LED3,GPIOPinRead(GPIO_PORTB_BASE,LED3)^LED3);/*翻转*/<br />&nbsp;&nbsp;&nbsp;&nbsp;SoftTimerRun(0,(TICKS_PER_SEC&nbsp;+&nbsp;1)&nbsp;/&nbsp;2,SoftTimerFunction1);<br />}<br /><br />void&nbsp;GPIOA_ISR(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;while(1);<br />}<br />
zlgmcu 发表于 2008-2-18 08:51 | 显示全部楼层

程序思路不错

不过程序有些复杂,建议另写一个非常简单的UART+Reset测试程序试试。看能否正常。<br />另外请注意RX和TX上是否有上拉电阻?(作为偏置,防止复位时处于悬空状态)<br /><br />(zlgmcu_wdx)
wahahaabc 发表于 2008-2-18 11:36 | 显示全部楼层

偶的和楼主一样

按下CPU&nbsp;PACK板上的RESET按键,串口会有乱码出现。这可能是由于在上电时,LM3S8962的引脚为低电平所致(不像51单片机,上电复位所有的I/O引脚都为高电平)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

23

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部