bootloader---15.串口

原创 2016年08月29日 13:56:33

串口时钟使用了PCLK,所以在初始化串口之前需要先将系统时钟初始化,(除非想一直使用默认时钟)。

一、代码
1. start.S 主要功能是:
     a.关闭看门狗
     b. 初始化系统时钟
     c. 设置堆栈
     d. 跳到main函数

点击(此处)折叠或打开

  1. .text
  2. .global _start
  3. _start:
  4.     /*disable watchdog*/
  5.     ldr r0, =0x53000000    
  6.     mov r1, #0x0
  7.     str r1, [r0]
  8.     
  9. #define COCKTIME    0x4C000000    
  10. #define MPLLCON        0x4C000004
  11. #define UPLLCON        0x4C000008
  12. #define CLKCON        0x4C00000C
  13. #define CLKSLOW        0x4C000010
  14. #define CLKDIVN     0x4C000014
  15. #define CAMDIVN     0x4C000018
  16.     /*FCLK:HCLK:PCLK=1:4:8*/
  17.     ldr r0, =CLKDIVN
  18.     mov r1, #0x05
  19.     str r1, [r0]

  20.     mrc p15, 0, r0, c1, c0, 0
  21.     orr r0, r0, #0xc0000000
  22.     mcr p15, 0, r0, c1, c0,0

  23.     /*MPLL=(2*m*Fin)/(P*(1<<S)), m=(MDIV+8), p=PDIV+2 s=SDIV*/
  24.     ldr r0, =MPLLCON 
  25.     ldr r1, =((0x5C<<12)|(0x01<<4)|(0x01))
  26.     str r1, [r0]
  27.     
  28.     ldr r0, =0x10000
  29. 1:
  30.     sub r0, r0, #1
  31.     bne 1b

  32.     /*UPLL=(m*Fin)/(P*(1<<S)), m=(MDIV+8), p=(PDIV+2), s=SDIV*/
  33.     ldr r0, =UPLLCON
  34.     ldr r1, =((0x10<<12)|(0x01<<4)|(0x01))
  35.     str r1, [r0]

  36.     ldr r0, =0x10000
  37. 1:
  38.     sub r0, r0, #1
  39.     bne 1b

  40.     /* set up the stack    */
  41.     ldr sp, =1024*4
  42.     bl main

  43. loop:
  44.     b loop
2. main.c 主要功能是:
a. 初始化串口
b. 进入死循环,每次点亮一个led灯,顺便打印一个字母'a'

点击(此处)折叠或打开

  1. #include "uart.h"
  2. #define GPBCON (*(volatile unsigned int *) 0x56000010)
  3. #define GPBDAT (*(volatile unsigned int *) 0x56000014)

  4. static inline void delay (unsigned long loops)
  5. {
  6.     __asm__ volatile ("1:\n"
  7.             "subs %0, %1, #1\n"
  8.             "bne 1b":"=r" (loops):"0" (loops));
  9. }

  10. void main()
  11. {
  12.     int i = 1;
  13.     GPBCON = 0x15400;
  14.     init_uart();
  15.     while(1)
  16.     {
  17.         GPBDAT = 0x7FF&(~i<<5);
  18.         i *= 2;
  19.         if(16==i)
  20.             i = 1;
  21.         delay(400000);
  22.         putc('a');
  23.     }
  24.     return ;
  25. }
3.uart.c 主要功能:
a. 初始化串口
b. 实现发送与接收函数getc与putc

点击(此处)折叠或打开

  1. #define GPHCON (* (volatile unsigned int *) 0x56000070)
  2. #define GPHUP (* (volatile unsigned int *) 0x56000078)

  3. #define ULCON0 (* (volatile unsigned int *) 0x50000000)
  4. #define UCON0 (* (volatile unsigned int *) 0x50000004)
  5. #define UFCON0 (* (volatile unsigned int *) 0x50000008)
  6. #define UMCON0 (* (volatile unsigned int *) 0x5000000C)
  7. #define UTRSTAT0 (* (volatile unsigned int *) 0x50000010)
  8. #define UERSTAT0 (* (volatile unsigned int *) 0x50000014)
  9. #define UFSTAT0 (* (volatile unsigned int *) 0x50000018)
  10. #define UMSTAT0 (* (volatile unsigned int *) 0x5000001C)
  11. #define UTXH0 (* (volatile unsigned char *) 0x50000020)
  12. #define URXH0 (* (volatile unsigned char *) 0x50000024)
  13. #define UBRDIV0 (* (volatile unsigned int *) 0x50000028)

  14. #define BAUD_RATE 115200

  15. void uart_init(void)
  16. {
  17.     GPHCON = 0x000000A0;
  18.     GPHUP = 0x000007FF;
  19.     ULCON0 = (0x03); //8N1        
  20.     UCON0 = (0x01<<2)|(0x01);
  21.     UFCON0 = 0;
  22.     UMCON0 = 0;
  23.     UBRDIV0 = (int)((50*1000*1000)/(BAUD_RATE*16))-1;
  24. }

  25. unsigned char uart_getc(void)
  26. {
  27.     while(!(UTRSTAT0 & 0x01))
  28.         ;
  29.     return (URXH0 & 0xff);
  30. }

  31. void uart_putc(char c)
  32. {
  33.     while (!(UTRSTAT0&0x02))
  34.         ;
  35.     UTXH0 = c;
  36.     if('\n' == c)
  37.         uart_putc('\r');
  38. }

  39. void uart_puts(char *s)
  40. {
  41.     while (*s)
  42.     {
  43.         uart_putc(*s++);
  44.     }
  45. }
注: uart.c中的uart_putc函数(ascii中: \n__换行__LF__0x10   \r__回车__CR__0x13 )
1. 当键盘敲下 Enter键时,从串口收到的按键是0x0d(即:\r 回车符:将光标移动到行首,而不换行)。
2. 当调用puts("hello\n");时putc收到\n后,将换行但光标的列不变,然后再输出\r,将光标移动到换行之后的行首,这样效果就跟平常的回车一样了。
4. uart.h

点击(此处)折叠或打开

  1. void uart_init(void);
  2. unsigned char uart_getc(void);
  3. void uart_putc(char c);

编译时只需要在Makefile的OBJS中添加uart.o就可以了。

二、测试一下getc函数
2.1 将main中主循环改为接收一个字符然后打印

点击(此处)折叠或打开

  1. uart_init();
  2. while(1)
  3.     {
  4.         c=uart_getc();
  5.         uart_putc(c);
  6.     }

版权声明:本文为博主原创文章,转载请注明出处。

自己动手写最简单的bootloader

首先我们必须要知道,一开始我们的开发板上电的时候, 如果我们的板子是从norflash启动的,那么硬件会从nandflash拷贝其前4k的代码到内部RAM中, (这也是为什么我们的bootloa...
  • bfboys
  • bfboys
  • 2016年09月04日 16:10
  • 1317

stm32 bootloader串口升级程序框架

1.IAP IAP是In Application Programming的首字母缩写,IAP是用户自己的程序在运行过程中对User Flash的部分区域进行烧写,目的是为了在产品发布后可以方便地...
  • sily521
  • sily521
  • 2017年02月09日 12:03
  • 935

STM32串口下载方法-USART BootLoader

玩STM32,J-LINK仿真器固然很好,不够J-Link价格昂贵,还好STM32内部自带Bootloader,可以串口下载程序。本人觉得串口下载方式简洁,廉价,就一个USB-TTL转换器即可完成。 ...
  • dongganxiao_maidou
  • dongganxiao_maidou
  • 2017年06月25日 21:26
  • 1688

介绍三款串口监控工具

在开发下位机下位机通讯程序时,有一个好的监控工具会事半功倍。特在网上找了几款串口监控软件,作了简单对比: 一、Device Monitoring Studio 网址:http://www.hhdsof...
  • xundh
  • xundh
  • 2015年01月05日 10:34
  • 48550

同步串口和异步串口的区别及使用情况

在计算机系统中,CPU和外部通信有两种通信方式:并行通信和串行通信。而按照串行数据的时钟控制方式,串行通信又可分为同步通信和异步通信两种方式。   1、异步串行方式的特点   所谓异步通信,是指数...
  • seashine_yan
  • seashine_yan
  • 2017年05月05日 10:56
  • 3817

linux下串口应用程序

1. 打开串口 与其他的关于设备编程的方法一样,在Linux下,操作、控制串口也是通过操作起设备文件进行的。在Linux下,串口的设备文件是/dev/ttyS0或/dev...
  • xxgxgx
  • xxgxgx
  • 2016年02月23日 16:54
  • 806

串口服务器的配置与连接调试

串口服务器型号:NSC6008-8 1.使用网线将PC与串口服务器进行连接。 2.将PC的IP设为如下 3.使用光盘所带软件update.exe找到与PC相连的串口服务器IP 点击图标修改串...
  • u013183444
  • u013183444
  • 2013年12月17日 11:57
  • 5559

android 使用服务读取串口数据实例

一些android 手机是有串口可以提供打开,读取一些底层的数据。如果手机本身没有串口的话,那么打开估计会报错。串口读取数据肯定是使用jni调用c代码来完成的。有一个开源的串口库android-ser...
  • qq_16064871
  • qq_16064871
  • 2017年01月08日 14:29
  • 6068

LInux下串口设置详解

串口的设置主要是设置struct termios结构体的各个成员值:#includestruct termios{        unsigned short c_iflag;          //...
  • huang879135
  • huang879135
  • 2011年03月31日 16:29
  • 7357

用API打开关闭串口的编程方法

在对串口进行操作之前都需要先打开串口,VC串口编程方法分为利用VC串口控件(或VC串口类)和直接调用Windows底层API函数(我称之为VC API 串口编程)两种方法,不管哪种方法,其实质都是利用...
  • korewayume
  • korewayume
  • 2015年07月16日 09:07
  • 2510
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:bootloader---15.串口
举报原因:
原因补充:

(最多只允许输入30个字)