本帖最后由 阳阳阳阳阳阳阳阳 于 2021-8-23 17:47 编辑
/****************************************************************** 编 译 器:Haawking IDE V0.5.0 D S P:dsc28027勇士板 电 脑 配 置:Windows10 专业版; 64 位操作系统 仿 真 器:HX100V2 使 用 库:无 作 用:上位机串口调试工具发送数据,DSP28027能够返回相应的数据 版 本:V0.0.1 ******************************************************************/ 1. HaawkingIDE新建工程
2. 初始化配置SCI模块 /****************************************************************** 函数名: void SCIA_Init(int32 Baud) 参 数:int32 Baud串口波特率 返回值:无 作 用:配置GPIO28、GPIO29为SCIA模式,波特率 = (low speed clock)/16*(DLH<<8+DLL) //3Mz系统时钟 300 DLL=0x9c 600 DLL=0x4E 1200 DLL=0x27 120M系统时钟 9600 DLL=0xc3 ******************************************************************/
- int SCIA_Init(int32 Baud)
- {
- uint32 pllcr_div,pllsts_divsel,sci_timer,lospcp_lspclk;
- // Enable the SCI-A clocks
- uint16 fre;
- int32 Baud_normal; //理论值
- int Baud_error; //误差
- EALLOW;
- SysCtrlRegs.PCLKCR0.bit.SCIAENCLK = 1; //使能SCIA的外设时钟的low speed clock
- SysCtrlRegs.LOSPCP.bit.LSPCLK = 0x1; //low speed clock = SYSCLKOUT/4 = 120/4 = 30M
- pllcr_div = SysCtrlRegs.PLLCR.bit.DIV; //pll倍频
- pllsts_divsel = SysCtrlRegs.PLLSTS.bit.DIVSEL; //pll分频
- lospcp_lspclk = SysCtrlRegs.LOSPCP.bit.LSPCLK; //低速外设的分频
- if(pllcr_div == 0) //pllcr=6 bypass
- {
- pllcr_div = 1; //不倍频
- }
- else
- {
- pllcr_div = pllcr_div+6; //+6
- }
- if((pllsts_divsel == 0)||(pllsts_divsel == 1))
- {
- pllsts_divsel = 4; //4分频
- }
- else if(pllsts_divsel == 2)
- {
- pllsts_divsel = 2; //2分频
- }
- else if(pllsts_divsel == 3)
- {
- pllsts_divsel = 1; //不分频
- }
- if(lospcp_lspclk == 0)
- {
- lospcp_lspclk = 1; //外设分频
- }
- else
- {
- lospcp_lspclk = 2*lospcp_lspclk; //
- }
- sci_timer = 12000000*pllcr_div/pllsts_divsel/lospcp_lspclk; // 12MHz*pll倍频/pll分频/外设分频
- fre = (uint16)(sci_timer/16/Baud); //频率
- Baud_normal = (int32)(sci_timer/16/fre); //波特率
- SciaRegs.SCILCR.bit.DLAB = 1;
- //分频计数器高8位 初始值为0
- SciaRegs.SCIDLH_SCIIER.SCIDLH_bits.DLH=(uint8)((fre>>8)&0xff);
- //分频计数器低8位 初始值为3
- //SciaRegs.SCIRBR_SCIDLL_SCITHR.SCITHR_bits.THR =0x1D;
- SciaRegs.SCIRBR_SCIDLL_SCITHR.SCIDLL_bits.DLL=(uint8)(fre&0xff);//3Mz系统时钟 300 0x9c 600 0x4E 1200 0x27 120M系统时钟 9600 0xc3 115200 0x10
- //切换其他要写入的寄存器
- SciaRegs.SCILCR.bit.DLAB = 0;
- // SciaRegs.SCIFCR_SCIIIR.all = 0x41;
- //使能 发送和接受的 FIFO
- SciaRegs.SCIFCR_SCIIIR.SCIFCR_bits.FIFOE=0;
- //发送空中断FIFO大小设置,无FIFO
- SciaRegs.SCIFCR_SCIIIR.SCIFCR_bits.TET = 0;
- //需要设置8位数据传输 不然会有问题
- SciaRegs.SCILCR.bit.DLS = 3;
- P_GpioCtrlRegs->GPAPUD.all &= 0xCFFFFFFF;
- P_GpioCtrlRegs->GPAMUX2.all |= 0x05000000;
- // Input qual for SCI-A RX is asynch
- P_GpioCtrlRegs->GPAQSEL2.bit.GPIO28 = 3;
- P_GpioCtrlRegs->GPAQSEL2.bit.GPIO29 = 3;
- EDIS;
- Baud_error = Baud_normal - Baud; //计算误差值
- return Baud_error;
- }
复制代码
数据发送函数: /****************************************************************** 函数名:void send_data(uint8 byteData) 参 数:uint8 byteData DSP28034发送的字节 返回值:无 作 用:调用此函数可以将数据发送到上位机
******************************************************************/
- void send_data(uint8 byteData)
- {
- while(0 == P_SciaRegs->SCILSR.bit.THRE);
- //数据发送寄存器
- P_SciaRegs->SCIRBR_SCIDLL_SCITHR.SCITHR_bits.THR = byteData;
- }
复制代码
SCI中断服务程序 /****************************************************************** 函数名:INTERRUPT void sciaRxFifoIsr() 参 数:无 返回值:无 作 用:SCI接收上位机发送的数据,然后判断发送寄存器是否为空,不为空则将数据发送至上位机
******************************************************************/
- INTERRUPT void sciaRxFifoIsr(void)
- {
- GetWordData = (Uint8)P_SciaRegs->SCIRBR_SCIDLL_SCITHR.SCIRBR_bits.RBR; //接收数据缓冲区
- while(0 == P_SciaRegs->SCILSR.bit.THRE); //发送寄存器不为空
- P_SciaRegs->SCIRBR_SCIDLL_SCITHR.SCITHR_bits.THR = GetWordData; //SCI发送数据到上位机
- PieCtrlRegs.PIEACK.all = PIEACK_GROUP9;
- }
- 3.main主函数
- int main(void)
- {
- //volatile unsigned int i;
- InitSysCtrl(); //将PLL配置成10倍频1分频,配置系统时钟为120M
- DINT; //不使能全局中断
- IER_DISABLE(0xffff); //禁能所有中断
- IFR_DISABLE(0xffff); //清所有中断标志位
- InitPieVectTable(); //This function initializes the PIE vector table to a known state.This function must be executed after boot time.
- EALLOW;
- PieCtrlRegs.PIEACK.all = 0xffff; //清除所有中断
- SciaRegs.SCIDLH_SCIIER.SCIIER_bits.ERBFI = 1; //配置SCI中断接收模式
- PieVectTable.SCIINTA = &sciaRxFifoIsr; //sci的中断入口地址为中断向量表的SCIINTA
- EDIS;
- IER_ENABLE(M_INT9); //CPU的第9组中断会产生
- PieCtrlRegs.PIEIER9.bit.INTx1 = 1; //使能中断INT9.1
- EINT;
- ERTM;
- SCIA_Init(9600);
- send_data(0x55); //0x55 ASCII码:U
- while(1){
- }
- return 0;
- }
复制代码
4. 接线 GND ---- GND 29 ---- RXI 28 ---- TXD
5. 运行结果
运行结果:串口调试工具设置波特率为9600,先接到字符’U’,然后发送任意字符可以接收到同样的字符。
0
|
|
|
|