历史上的今天
返回首页

历史上的今天

今天是:2025年01月31日(星期五)

2020年01月31日 | ARM裸机篇--串口UART实验

2020-01-31 来源:eefocus

串口应该都很熟悉了,具体通信原理我就不提了,这个百度上都很多讲的,然后就直接看函数了。

void Uart_SendByte(int data)//这个函数是发送整型数据,参数为data
{
    if(whichUart==0)//这个是选中串口0
    {
        if(data=='n')//然后判断数据不为空
        {
      /*寄存器的原始宏定义,
      #define rUTRSTAT0   (*(volatile unsigned *)0x50000010) //UART 0 Tx/Rx status*/
            while(!(rUTRSTAT0 & 0x2));/*这个就是查询串口0的状态寄存器,第1位是发送缓冲器是否为空
            第二位是Transmit buffer empty
            0 = The buffer register is not empty
            1 = Empty     这里检查为0的话就是还没发送完全,当置1的时候表示发完了,程序继续执行*/
            Delay(10);                 //because the slow response of hyper_terminal
            WrUTXH0('r');
        }
        while(!(rUTRSTAT0 & 0x2));   //Wait until THR is empty.
        Delay(10);
        WrUTXH0(data);
    }
    else if(whichUart==1)
    {
        if(data=='n')
        {
            while(!(rUTRSTAT1 & 0x2));
            Delay(10);                 //because the slow response of hyper_terminal
            rUTXH1 = 'r';
        }
        while(!(rUTRSTAT1 & 0x2));   //Wait until THR is empty.
        Delay(10);
        rUTXH1 = data;
    }  
    else if(whichUart==2)
    {
        if(data=='n')
        {
            while(!(rUTRSTAT2 & 0x2));
            Delay(10);                 //because the slow response of hyper_terminal
            rUTXH2 = 'r';
        }
        while(!(rUTRSTAT2 & 0x2));   //Wait until THR is empty.
        Delay(10);
        rUTXH2 = data;
    }      
}

 

搞了这么久我还不知道如何确定ARM的大端或是小端格式,这个是在启动代码里设置的,现在还没看,mini2440的串口代码和华恒2410的串口发送代码一样的。注释如上。

主函数中的关键代码:

/***************************************************************************************
*   Function Name               :   Main()
*   Create Date                 :   2011/12/10
*   Author/Corporation          :   涛行天下
*
*   Description                 :   Find a proper thread in thread array
*
*   Param                       :   ThreadNo : someParam description
                                    ThreadStaus : someParam description
*
*
*   Global Variable             :   DISP_wuiSegmentAppID
*   File Static Variable                :   naucThreadNo
*   Function Static Variable        :   None
*  
*----------------------------------------------------
*   Revision History
*   No.         Date          Revised by                 Item       Description
*   V0.0           2011/12/10     涛行天下          ...         ....
***************************************************************************************/
void Main(void)
{
    U8 count_num = 0;
    char *mode;
    int i;
    U8 key;
    U32 mpll_val = 0 ;
    //U32 divn_upll = 0 ;
     
    #if ADS10  
//  __rt_lib_init(); //for ADS 1.0
    #endif
 
    Port_Init();//端口初始化
     
    Isr_Init();//中断初始化
     
    i = 2 ; //don't use 100M!
        //boot_params.cpu_clk.val = 3;
    //确定频率
    switch ( i )
    {
        case 0: //200
            key = 12;
            mpll_val = (92<<12)|(4<<4)|(1);
            break;
        case 1: //300
            key = 13;
            mpll_val = (67<<12)|(1<<4)|(1);
            break;
        case 2: //400
            key = 14;
            mpll_val = (92<<12)|(1<<4)|(1);
            break;
        case 3: //440!!!
            key = 14;
            mpll_val = (102<<12)|(1<<4)|(1);
            break;
        default:
            key = 14;
            mpll_val = (92<<12)|(1<<4)|(1);
            break;
    }
     
    //init FCLK=400M, so change MPLL first
    ChangeMPllValue((mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3);
    ChangeClockDivider(key, 12);
    cal_cpu_bus_clk();
     
    consoleNum = 0; // Uart 1 select for debug.选择串口号
    Uart_Init( 0,115200 );//初始化串口参数以及时钟源
    Uart_Select( consoleNum );//选择串口号
     
    Beep(2000, 100);//蜂鸣器
     
    Uart_SendByte('n');//打印信息
    Uart_SendByte('H');
    while(1)
    {
        Uart_SendByte(count_num);
        Uart_SendByte(' ');
        count_num ++;
        Delay(500);
    }

 

从而让ARM一直向PC机发送从0-255数据,在PC机中显示结果如下:

串口截图

这个看不了十六进制的数,我搞了个串口助手来显示:

串口助手显示十六进制

上面那个是用mini2440实现的,那个通过UBOOT可以直接烧写程序,不过到了华恒的板子我就不知道为啥了,这个苦闷了我好久,今天在进入PPCBOOT中利用erase命令把那个linux系统檫除了,然后进入ppcboot命令行形式才可以jtag调试,不知道为啥,这次终于进了一次调试结果出来了。

下面出一张计数的图,感觉下成就感吧,虽然底层函数还没完全弄懂!

 现在总结这些步骤吧,最开始在上电的时候不要立马启动系统,先要进入PPCBOOT模式命令行,然后再启动AXD调试器。

通过H-JATG软件可以看到是小端格式的,但是具体怎么设置暂时还不清楚,

#define WrUTXH0(ch) (*(volatile unsigned char *)0x50000020)=(unsigned char)(ch)

 WrUTXH0即是写UTXH0的意思,UTXH0是第一个串口的发送缓冲寄存器!

 2011/12/13日

还是阿南的程序给力啊,华恒板子带的程序没啥用

2011/12/21日

感慨日子过的飞快啊!可是我却没啥长进,先上程序吧:

;//呼叫主应用程序
    b UART
UART
    ldr r0, =GPHCON ;//设置RxD0,TxD0引脚
    ldr r1, =0x2afaaa
    str r1, [r0]
     
    ldr r0, =GPHUP
    ldr r1, =0x7ff
    str r1, [r0] ;    // The pull up function is disabled GPH[10:0]
 
 
    ldr r0, =UFCON0 ;//禁用FIFO
    ldr r1, =0x0
    str r1, [r0]
    
    ldr r0, =UMCON0  ;//禁用AFC
    ldr r1, =0x0
    str r1, [r0]
     
    ldr r0, =ULCON0 ;//设置线寄存器
    ldr r1, =0x3   ; //UART LINE CONFIG  正常模式,无奇偶校验,一个停止位,8个数据位
    str r1, [r0]
     
    ldr r0, =UCON0 ;//设置Uart0控制器
    ldr r1, =0x245;//RX边沿触发,TX电平触发,禁用延时中断,使用RX 错误中断,正常操作模式,中断请求或表决模式
    str r1, [r0]
     
    ldr r0, =UBRDIV0 ;//设置波特率为115200
    ldr r1, =0x1a    ;//int(50700000 / 16 / 115200) - 1 = 26
    str r1, [r0]
     
    mov r1, #100
Delay
    sub r1, r1, #0x1
    bne Delay
     
    ;//开中断
    ldr r0, =INTMSK
    ldr r1, [r0]
    and r1, r1, #0xefffffff
    str r1, [r0]
     
    MOV R5 , #127 ;//设置要打印的字符的个数
    MOV R1 , #0x0 ;//设置要打印的字符
LOOP 
   LDR R3 , =UTRSTAT0
   LDR R2 , [R3]
   TST R2 ,#0x04 ;//判断发送缓冲区是否为空
   BEQ LOOP      ;//为空则执行下边的语句,不为空则跳转到LOOP
   LDR R0 , =UTXH0
    
   STR R1 ,[R0] ;//向数据缓冲区放置要发送的数据
   ADD R1, R1, #1
   SUB R5 ,R5, #0x01 ;//计数器减一
   CMP R5 ,#0x0
   BNE LOOP
   
LOOP2   B LOOP2

这个紧跟随这启动代码后面的一部分用汇编编的串口发送程序,设置相关寄存器,然后往PC端发送数据。

推荐阅读

史海拾趣

GE公司的发展小趣事

对于光电控制电子生日蛋糕电路,网友可能提出多种问题。以下是一些可能的问题及其详细回答:

1. 光电控制电子生日蛋糕电路的基本工作原理是什么?

回答:光电控制电子生日蛋糕电路通常由一个光敏二极管(如VD1)、一个控制电路(如IC1,常为555时基集成电路或音乐芯片)以及其他外围元器件组成。当蜡烛被点燃并照射到光敏二极管上时,光敏二极管的电阻会发生变化,导致控制电路中的电压改变。这一电压变化进而触发控制电路,使其输出控制信号,驱动音乐芯片工作并输出音乐信号(如“祝你生日快乐”),同时可能还驱动发光二极管等元件闪烁,增加节日气氛。

2. 如何选择合适的元器件来构建这个电路?

回答:选择合适的元器件是构建光电控制电子生日蛋糕电路的关键。光敏二极管应选择灵敏度适中、响应速度快的型号;控制电路可以选择555时基集成电路或专用的音乐芯片,具体取决于电路设计的复杂度和功能需求;发光二极管可以选择高亮度、颜色鲜艳的型号以增强视觉效果;此外,还需要根据电路设计选择合适的电阻、电容等元器件。

3. 这个电路存在哪些安全隐患,如何避免?

回答:虽然光电控制电子生日蛋糕电路本身在正常情况下是安全的,但如果不当使用或制作过程中存在瑕疵,仍可能带来安全隐患。例如,电路中的电池如果处理不当,可能会导致电池液泄漏或短路;电子元件过热也可能引发火灾等。为了避免这些安全隐患,应确保电池安装牢固、电路连接正确无误;在使用过程中避免长时间连续工作,以防过热;同时,应让儿童在成人监护下使用此类电子生日蛋糕。

4. 如何调试和优化这个电路的性能?

回答:调试和优化光电控制电子生日蛋糕电路的性能可以通过以下步骤进行:首先检查电路连接是否正确无误;然后逐步测试各个元器件的功能是否正常;接着调整光敏二极管的灵敏度、控制电路的输出电压等参数以优化电路性能;最后在实际使用环境中进行整体测试,确保电路能够稳定可靠地工作。在调试过程中可以使用万用表等测试工具来监测电路中的电压、电流等参数变化。

5. 除了音乐和发光效果外,这个电路还可以实现哪些功能?

回答:除了基本的音乐和发光效果外,光电控制电子生日蛋糕电路还可以根据具体设计实现多种功能。例如可以加入烟雾效果装置来模拟真实的蜡烛燃烧效果;或者加入语音模块来播放生日祝福语等。这些功能的实现需要增加相应的元器件和电路设计复杂度但能够显著提升生日蛋糕的趣味性和观赏性。需要注意的是在实现这些功能时应充分考虑安全性和实用性避免过度复杂导致电路不稳定或安全隐患增加。

DeLorme公司的发展小趣事

进入21世纪后,DeLorme公司凭借其在GPS技术领域的深厚积累,不断推出具有创新性的产品。其中,一款集成了GPS、电子罗盘和高度计等多功能的户外导航设备在市场上引起了广泛关注。这款产品不仅具有高精度、高可靠性的特点,还具备了用户友好的界面设计和人性化的操作体验。通过这款产品,DeLorme公司进一步巩固了其在户外导航领域的领先地位。

康龙(CONCRAFT)公司的发展小趣事

进入XXXX年代,康龙公司意识到技术创新是企业持续发展的关键。于是,公司投入大量资金引进先进的生产设备和技术人才,加强研发力量。经过几年的努力,康龙在精密模具设计和开发方面取得了重大突破,大大提高了生产效率和产品精度。同时,公司还注重产品质量的提升,通过严格的质量控制和检验流程,确保每一件产品都符合客户的高标准要求。

Compostar Technology Co Ltd公司的发展小趣事

人才是企业发展的核心。Compostar Technology Co Ltd深知这一点,因此一直注重人才培养和团队建设。公司建立了完善的人才培训体系,为员工提供了广阔的职业发展空间。同时,公司还积极营造良好的企业文化氛围,激发员工的创新精神和团队合作精神。这些举措使得公司拥有一支高素质、高效率的员工队伍,为公司的持续发展提供了有力保障。

General Electric Company公司的发展小趣事
内部集成了频率补偿机制,确保在高频信号下电路的稳定性。
Brilliance公司的发展小趣事

在国内市场取得一定成功后,Brilliance公司开始将目光投向国际市场。公司制定了详细的国际化战略,积极寻求与国际知名企业的合作机会。通过与国外合作伙伴的共同努力,Brilliance的产品逐渐打入国际市场,并获得了良好的口碑。同时,公司还积极参加国际电子展会和交流活动,提升了品牌知名度和影响力。

问答坊 | AI 解惑

低压大电流开关电源的设计

1 引言       为了以更低的功耗获得更高的速度和更佳的性能,要求电源电压越来越低,瞬态性能指标越来越高,因此对开关电源提出了越来越高的要求。用原有的电路拓扑及整流方式已不能满足现在的要求,为了适应IC芯片发展的需要,人们开始研 ...…

查看全部问答>

如何成为一个优秀的模电设计师

请大家说说如何成为一个优秀的模电设计师,现在又做业务又做工程,累呀,总觉得知识更新不够快,跟不上形势。…

查看全部问答>

HT1622的使用问题,望牛人告知!

硬件结构图 这是我的源代码: #include #include typedef unsigned char byte; typedef unsigned int byte2; typedef unsigned long byte4; typedef byte bool; #define TRUE 1 #define FALSE 0 sbit CS = P0^0; sbit WR_CLK = P0^1; sbit ...…

查看全部问答>

如何查看WINCE 主频?

我用的是YLP2440的开发板,通过CE\\windows\\cpucheck.exe查看FCLK=200M。我在BSP中看到的MPLLCON=0X5C011,计算出来的FCLK=400。请问该板子FCLK究竟是多少?如果需要更改的话,是不是改BSP中MPLLCON就可以了?…

查看全部问答>

lstAdd的使用问题!

    SESSION_POS_S *pTestpos1, *pTestpos2, *pTestpos3, *pPos;     LIST *pMyList = NULL;     int NodeIndex = 0;             DPRINT(\"-------- lstAdd测试 -------\\n\" ...…

查看全部问答>

STR712不能在RAM中调试吗?所给例程都是在Flash中调试的吗?

                                 如果用ST的ARM只能买J-link吗?…

查看全部问答>

万利电子的STM32价格公布了

                                  …

查看全部问答>

【讨论】430在没有烧写程序的状态下,如何根据引脚状态判断它的好坏?

如题。 不烧程序,它的晶振也不会起振的吧? 请知道的大侠来赐教。…

查看全部问答>

毕业设计所需:请推荐串口接收数据能图像显示的软件

我的毕业设计是DS18B20温度传感 + nRF24L01无线数传 + 232串口发送给PC + 上位机显示但是,师兄的要求是要图表形式显示温度变化串口助手见得多了,找一个也不费事。但是好像就没见过能用图表显示的。最开始的打算是自己把当初上课学过的LABVIEW重新 ...…

查看全部问答>

【MSP430超低功耗时钟】软件框图

今天写软件写累了,休息一下,把MSP430超低功耗时钟的软件框图整理了一下。由于具体的IC还没确定。所以只能写个大概的框图。希望版主见谅。 …

查看全部问答>