既然是在裸机上跑程序,就一定需要一段汇编语言去初始化硬件,然后用C语言写串口初始化程序。
因为ARM一上电就从地址0x0处运行程序,所以我们把程序烧到FLASH里去运行,这样在板子重启后程序也不会消失。
以下程序都是在Linux下完成的。
第一个程序汇编start.S:
.text .globl _start _start:
/*关闭看门狗*/ ldr r0, =0x400040BC /*0x00000000*/ mov r1, #0 /*0x00000004*/ str r1, [r0] /*0x00000008*/
/*设置堆栈4K,这里要看可用的内存有多大,设置的栈不能大于可用的内存,我的这块板子可用内存最大16K*/ ldr sp, =1024*4 /*0x00000010*/ bl main /*0x00000014*/ halt_loop: b halt_loop /*0x00000018*/
|
第二个程序uart.c:
#include "config3200.h" //寄存器地址的宏定义
#define DLM 0
#define DLL 1
volatile uint32 Snd_N = 0;
void UART5_SendByte(uint8 data)
{
U5THR = data;
while(U5LSR & 0x40 == 0);
}
void UART5_SendBuf(uint8 const *RcvBufPt, uint32 Snd_N)
{
uint32 i = 0;
for(i = 0; i < Snd_N; i++){
UART5_SendByte( *RcvBufPt++ );
}
}
void UART5_Init(void)
{
/*
* 设置波特率
*/
U5LCR = 0x83; /* 使能波特率分频器锁存的访问 */
U5DLM = DLM; /* 给分频器赋值,这里赋值为1 */
U5DLL = DLL;
U5LCR = 0x03; /* 使能THR,RBR,IER寄存器 */
U5CLK = (134 << 0) | (19 << 8); /* 设置小数分频器为X/Y=19/134 */
U5FCR = 0x3F; /* 使能FIFO,并设置FIFO触发深度 */
UART_CLKMODE = 0x0200; /* 选择UART5的时钟模式 */
}
int main(void)
{
uint32 i = 0;
UART5_Init();
while (1) {
UART5_SendBuf("hello ", 6);
while (i++ < 10000);
i = 0;
}
return 0;
}
/*********************************************************************************************************
END FILE
*********************************************************************************************************/
|
最后我们需要一个二进制uart.bin,使用Makefile文件完成:
uart.bin: start.S uart.c
arm-vfp-linux-gnu-gcc -c -o start.o start.S
arm-vfp-linux-gnu-gcc -c -o uart.o uart.c
arm-vfp-linux-gnu-ld -Ttext 0x00000000 start.o uart.o -o uart_elf
arm-vfp-linux-gnu-objcopy -O binary -S uart_elf uart.bin
clean:
rm *.bin *.o uart_elf |
输入make命令就可以得到uart.bin文件。这个二进制文件可以通过串口或者并口下载到FLASH中。下在完成后,重启板子即可来收到串口信息:hello.
阅读(3808) | 评论(0) | 转发(0) |