本帖最后由 阳阳阳阳阳阳阳阳 于 2021-8-23 14:20 编辑
/****************************************************************** 编 译 器:Haawking IDE V0.5.0 D S P:dsc28027勇士板 电 脑 配 置:Windows10 专业版; 64 位操作系统 仿 真 器:HX100V2 使 用 库:无 作 用:串口SCI例程 版 本:V0.0.1 ******************************************************************/ 1. HaawkingIDE新建工程
2. 初始化SCI /****************************************************************** 函 数 名:void SCIA_Init() 参 数:无 返 回 值:无 作 用:初始化SCI
******************************************************************/
- void SCIA_Init()
- {
- // Enable the SCI-A clocks
- EALLOW;
- SysCtrlRegs.PCLKCR0.bit.SCIAENCLK = 1; //使能SCI-A时钟
- SciaRegs.SCILCR.bit.DLAB = 1; //LCR[7]=1, enable, 兼容16550
- SciaRegs.SCIDLH_SCIIER.SCIDLH_bits.DLH = 0;//分频计数器高8位 初始值为0
- SciaRegs.SCIRBR_SCIDLL_SCITHR.SCIDLL_bits.DLL=0;
- SciaRegs.SCILCR.bit.DLAB = 0; //切换其他要写入的寄存器
- SciaRegs.SCILCR.bit.DLS = 3; //需要设置8位数据传输
- GpioCtrlRegs.GPAPUD.all &= 0xCFFFFFFF; //enable GPIO28、29
- GpioCtrlRegs.GPAMUX2.all |= 0x05000000; //GPIO29=01=SCITXDA-SCI-A transmit(O); GPIO28=01=SCIRXDA-SCI-A receive(I)
- // Input qual for SCI-A RX is asynch
- GpioCtrlRegs.GPAQSEL2.bit.GPIO28 = 3; //异步。此选项仅适用于配置为外设的引脚
- EDIS;
- return;
- }
复制代码
自动检测波特率:
- void SCIA_AutobaudLock()
- {
- Uint16 byteData;
- EALLOW;
- SciaRegs.SCIAUTOBAUD.bit.CDC = 1; //使能自动波特率
- SciaRegs.SCIAUTOBAUD.bit.INTEN = 0; //检测完成自动发送中断
- while(SciaRegs.SCIAUTOBAUD.bit.DONE != 1) {} //等待直到正确读到'A'或者'a',and lock
- SciaRegs.SCIAUTOBAUD.bit.CDC = 0; //在autobaud lock后,清除 CDC 位
- SciaRegs.SCILCR.bit.DLS = 3; //自动波特率检测会清零该寄存器,需重新配置为8-bit模式
- SciaRegs.SCILCR.bit.DLAB = 0; //除数锁存器只可写(当UART不忙时)
- //等待发送寄存器为空,波特率检测成功,回传上位机接收到的数据
- while(0 == SciaRegs.SCILSR.bit.THRE);
- //数据发送寄存器
- byteData = SciaRegs.SCIAUTOBAUD.bit.REV; //读出上位机接收到的数据
- SciaRegs.SCIRBR_SCIDLL_SCITHR.SCITHR_bits.THR = byteData; //回传数据
- //波特率检测成功后,接收新的数据,并回传上位机
- while(SciaRegs.SCILSR.bit.DR != 1) { } //接收器在RBR或FIFO中至少包含一个字符(数据准备好)
- byteData = SciaRegs.SCIRBR_SCIDLL_SCITHR.SCIRBR_bits.RBR; //读出接收到的新数据
- while(0 == SciaRegs.SCILSR.bit.THRE); //等待发送寄存器为空
- //数据发送寄存器
- SciaRegs.SCIRBR_SCIDLL_SCITHR.SCITHR_bits.THR = byteData; //把接收到的新数据回传给上位机
- EDIS;
- return;
- }
复制代码
数据传至上位机:
- void scia_xmit(uint8 temp)
- {
- while(0 == SciaRegs.SCILSR.bit.THRE); //等待发送寄存器为空
- //数据发送寄存器
- SciaRegs.SCIRBR_SCIDLL_SCITHR.SCITHR_bits.THR = temp; //把temp值传给上位机
- }
复制代码
3.main函数:
- void main(void)
- {
- InitSysCtrl();
- DINT;
- InitPieCtrl();
- IER_DISABLE(0xffff);
- IFR_DISABLE(0xffff);
- InitPieVectTable();
- SCIA_Init();
- SCIA_AutobaudLock();
- scia_xmit('
- '); //发送回车(回到当前行的行首,而不会换到下一行)
- scia_xmit('
- '); //发送换行(换到当前位置的下一行,而不会回到行首)
- scia_xmit('A'); //发送字母A
- timer0_init(); //定时器0初始化,1ms周期中断
- //中断配置
- EINT; // 使能全局中断 Enable Global interrupt INTM
- ERTM;
- while(1)
- {
- if(timer0Base.msCounter>100) //每隔一段时间
- {
- timer0Base.msCounter=0;
- scia_xmit(0x55); //发送0x55(ASCII码:U)
- }
- }
- }
复制代码
4.点击编译、编译完成后点击下载:
5.实验现象: 接线如下: GND ---- GND 29 ---- RXI 28 ---- TXD 然后使用串口调试工具,操作如下:打开--输入A或a--发送--输入任意数字--发送。窗口中接收显示:A或者a->回车->换行->U(每隔一段时间接收一次U)
运行结果如下图所示: |