实验六--串口

发布时间:2023-06-13  

一。环境 


     开发板:jz2440


  系统:  ubuntu12.04


  编译器:arm-linux-gcc


二。UART


  先省下。


三。直接贴代码


 Makefile


 1 objs := head.o init.o serial.o main.o

 2 

 3 uart.bin: $(objs)

 4     arm-linux-ld -Ttext 0x00000000 -o uart_elf $^

 5     arm-linux-objcopy -O binary -S uart_elf $@

 6     arm-linux-objdump -D -m arm uart_elf > uart.dis

 7     

 8 %.o:%.c

 9     arm-linux-gcc -Wall -O2 -c -o $@ $<

10 

11 %.o:%.S

12     arm-linux-gcc -Wall -O2 -c -o $@ $<

13 

14 clean:

15     rm -f uart.bin uart_elf uart.dis *.o        

16     


head.S:


 1 @******************************************************************************

 2 @ File:head.S

 3 @ 功能:设置SDRAM,将程序复制到SDRAM,然后跳到SDRAM继续执行

 4 @******************************************************************************       

 5    

 6 .extern     main

 7 .text 

 8 .global _start 

 9 _start:

10 Reset:                  

11     ldr sp, =4096           @ 设置栈指针,以下都是C函数,调用前需要设好栈

12     bl  disable_watch_dog   @ 关闭WATCHDOG,否则CPU会不断重启

13     bl  clock_init          @ 设置MPLL,改变FCLK、HCLK、PCLK

14 

15     ldr pc, =on_sdram                   @ 跳到SDRAM中继续执行

16 on_sdram:

17     ldr sp, =0x34000000     @ 设置栈指针

18     ldr lr, =halt_loop      @ 设置返回地址

19     ldr pc, =main           @ 调用main函数

20 halt_loop:

21     b   halt_loop


init.c


 1 /*

 2  * init.c: 进行一些初始化

 3  */ 

 4 

 5 #include "s3c24xx.h"

 6  

 7 void disable_watch_dog(void);

 8 void clock_init(void);

 9 

10 

11 /*

12  * 关闭WATCHDOG,否则CPU会不断重启

13  */

14 void disable_watch_dog(void)

15 {

16     WTCON = 0;  // 关闭WATCHDOG很简单,往这个寄存器写0即可

17 }

18 

19 #define S3C2410_MPLL_200MHZ     ((0x5c<<12)|(0x04<<4)|(0x00))

20 #define S3C2440_MPLL_200MHZ     ((0x5c<<12)|(0x01<<4)|(0x02))

21 /*

22  * 对于MPLLCON寄存器,[19:12]为MDIV,[9:4]为PDIV,[1:0]为SDIV

23  * 有如下计算公式:

24  *  S3C2410: MPLL(FCLK) = (m * Fin)/(p * 2^s)

25  *  S3C2410: MPLL(FCLK) = (2 * m * Fin)/(p * 2^s)

26  *  其中: m = MDIV + 8, p = PDIV + 2, s = SDIV

27  * 对于本开发板,Fin = 12MHz

28  * 设置CLKDIVN,令分频比为:FCLK:HCLK:PCLK=1:2:4,

29  * FCLK=200MHz,HCLK=100MHz,PCLK=50MHz

30  */

31 void clock_init(void)

32 {

33     // LOCKTIME = 0x00ffffff;   // 使用默认值即可

34     CLKDIVN  = 0x03;            // FCLK:HCLK:PCLK=1:2:4, HDIVN=1,PDIVN=1

35 

36     /* 如果HDIVN非0,CPU的总线模式应该从“fast bus mode”变为“asynchronous bus mode” */

37 __asm__(

38     "mrc    p15, 0, r1, c1, c0, 0n"        /* 读出控制寄存器 */ 

39     "orr    r1, r1, #0xc0000000n"          /* 设置为“asynchronous bus mode” */

40     "mcr    p15, 0, r1, c1, c0, 0n"        /* 写入控制寄存器 */

41     );

42 

43     /* 判断是S3C2410还是S3C2440 */

44     if ((GSTATUS1 == 0x32410000) || (GSTATUS1 == 0x32410002))

45     {

46         MPLLCON = S3C2410_MPLL_200MHZ;  /* 现在,FCLK=200MHz,HCLK=100MHz,PCLK=50MHz */

47     }

48     else

49     {

50         MPLLCON = S3C2440_MPLL_200MHZ;  /* 现在,FCLK=200MHz,HCLK=100MHz,PCLK=50MHz */

51     }       

52 }


main.c


 1 #include "serial.h"

 2 

 3 int main()

 4 {

 5     unsigned char c;

 6     uart0_init();   // 波特率115200,8N1(8个数据位,无校验位,1个停止位)

 7 

 8     while(1)

 9     {

10         // 从串口接收数据后,判断其是否数字或子母,若是则加1后输出

11         c = getc();

12         if (isDigit(c) || isLetter(c))

13             putc(c+1);

14     }

15 

16     return 0;

17 }


serial.h:


1 void uart0_init(void);

2 void putc(unsigned char c);

3 unsigned char getc(void);

4 int isDigit(unsigned char c);

5 int isLetter(unsigned char c);


serial.c

 1 #include "s3c24xx.h"

 2 #include "serial.h"

 3 

 4 #define TXD0READY   (1<<2)

 5 #define RXD0READY   (1)

 6 

 7 #define PCLK            50000000    // init.c中的clock_init函数设置PCLK为50MHz

 8 #define UART_CLK        PCLK        //  UART0的时钟源设为PCLK

 9 #define UART_BAUD_RATE  115200      // 波特率

10 #define UART_BRD        ((UART_CLK  / (UART_BAUD_RATE * 16)) - 1)

11 

12 /*

13  * 初始化UART0

14  * 115200,8N1,无流控

15  */

16 void uart0_init(void)

17 {

18     GPHCON  |= 0xa0;    // GPH2,GPH3用作TXD0,RXD0

19     GPHUP   = 0x0c;     // GPH2,GPH3内部上拉

20 

21     ULCON0  = 0x03;     // 8N1(8个数据位,无较验,1个停止位)

22     UCON0   = 0x05;     // 查询方式,UART时钟源为PCLK

23     UFCON0  = 0x00;     // 不使用FIFO

24     UMCON0  = 0x00;     // 不使用流控

25     UBRDIV0 = UART_BRD; // 波特率为115200

26 }

27 

28 /*

29  * 发送一个字符

30  */

31 void putc(unsigned char c)

32 {

33     /* 等待,直到发送缓冲区中的数据已经全部发送出去 */

34     while (!(UTRSTAT0 & TXD0READY));

35     

36     /* 向UTXH0寄存器中写入数据,UART即自动将它发送出去 */

37     UTXH0 = c;

38 }

39 

40 /*

41  * 接收字符

42  */

43 unsigned char getc(void)

44 {

45     /* 等待,直到接收缓冲区中的有数据 */

46     while (!(UTRSTAT0 & RXD0READY));

47     

48     /* 直接读取URXH0寄存器,即可获得接收到的数据 */

49     return URXH0;

50 }

51 

52 /*

53  * 判断一个字符是否数字

54  */

55 int isDigit(unsigned char c)

56 {

57     if (c >= '0' && c <= '9')

58         return 1;

59     else

60         return 0;       

61 }

62 

63 /*

64  * 判断一个字符是否英文字母

65  */

66 int isLetter(unsigned char c)

67 {

68     if (c >= 'a' && c <= 'z')

69         return 1;

70     else if (c >= 'A' && c <= 'Z')

71         return 1;       

72     else

73         return 0;

74 }


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>