start.S文件:
.globl _start
_start:
// 硬件相关的设置
// Peri port setup
ldr r0, =0x70000000
orr r0, r0, #0x13
mcr p15,0,r0,c15,c2,4 @ 256M(0x70000000-0x7fffffff)
// 关看门狗
// 往WTCON(0x7E004000)写0
ldr r0, =0x7E004000
mov r1, #0
str r1, [r0]
// 设置栈
ldr sp, =8*1024
// 设置时钟
bl clock_init
bl main
halt:
b halt
=====================================================================
clock.c源码:
#define APLL_LOCK (*((volatile unsigned long *)0x7E00F000))
#define MPLL_LOCK (*((volatile unsigned long *)0x7E00F004))
#define EPLL_LOCK (*((volatile unsigned long *)0x7E00F008))
#define OTHERS (*((volatile unsigned long *)0x7e00f900))
#define CLK_DIV0 (*((volatile unsigned long *)0x7E00F020))
#define ARM_RATIO 0 // ARMCLK = DOUTAPLL / (ARM_RATIO + 1)
#define HCLKX2_RATIO 4 // HCLKX2 = HCLKX2IN / (HCLKX2_RATIO + 1) = 100MHz
#define HCLK_RATIO 0 // HCLK = HCLKX2 / (HCLK_RATIO + 1) = 100MHz
#define PCLK_RATIO 1 // PCLK = HCLKX2 / (PCLK_RATIO + 1) = 50MHz
#define MPLL_RATIO 0 // DOUTMPLL = MOUTMPLL / (MPLL_RATIO + 1)
#define APLL_CON (*((volatile unsigned long *)0x7E00F00C))
#define APLL_CON_VAL ((1<<31) | (250 << 16) | (3 << 8) | (1))
#define MPLL_CON (*((volatile unsigned long *)0x7E00F010))
#define MPLL_CON_VAL ((1<<31) | (250 << 16) | (3 << 8) | (1))
#define CLK_SRC (*((volatile unsigned long *)0x7E00F01C))
//MDIV=250 对应: ARMCLK = 500MHz, HCLK = 100MHz, PCLK = 50MHZ
//MDIV=266 对应: ARMCLK = 532MHz, HCLK = 133MHz, PCLK = 66.5MHZ
void clock_init(void)
{
APLL_LOCK = 0xffff;
MPLL_LOCK = 0xffff;
EPLL_LOCK = 0xffff;
// set async mode 当CPU时钟 != HCLK时,要设为异步模式
OTHERS &= ~0xc0;
while ((OTHERS & 0xf00) != 0);
CLK_DIV0 = (ARM_RATIO) | (MPLL_RATIO << 4) | (HCLK_RATIO << 8) | (HCLKX2_RATIO << 9) | (PCLK_RATIO << 12);
APLL_CON = APLL_CON_VAL; // 500MHz
MPLL_CON = MPLL_CON_VAL; // 500MHz
CLK_SRC = 0x03;
}
====================================================================
uart.c源码:
#define ULCON0 (*((volatile unsigned long *)0x7F005000))
#define UCON0 (*((volatile unsigned long *)0x7F005004))
#define UFCON0 (*((volatile unsigned long *)0x7F005008))
#define UMCON0 (*((volatile unsigned long *)0x7F00500C))
#define UTRSTAT0 (*((volatile unsigned long *)0x7F005010))
#define UFSTAT0 (*((volatile unsigned long *)0x7F005018))
#define UTXH0 (*((volatile unsigned char *)0x7F005020))
#define URXH0 (*((volatile unsigned char *)0x7F005024))
#define UBRDIV0 (*((volatile unsigned short *)0x7F005028))
#define UDIVSLOT0 (*((volatile unsigned short *)0x7F00502C))
#define GPACON (*((volatile unsigned long *)0x7F008000))
void init_uart(void)
{
GPACON &= ~0xff;
GPACON |= 0x22;
// ULCON0
ULCON0 = 0x3; // 数据位:8, 无较验, 停止位: 1, 8n1
UCON0 = 0x5; // 使能UART发送、接收
UFCON0 = 0x01; // FIFO ENABLE
UMCON0 = 0;
// 波特率
// DIV_VAL = (PCLK / (bps x 16 ) ) - 1
// bps = 57600
// DIV_VAL = (66500000 / (115200 x 16 ) ) - 1
// = 35.08
UBRDIV0 = 35;
// x/16 = 0.08
// x = 1
UDIVSLOT0 = 0x1;
}
char getchar(void)
{
while ((UFSTAT0 & 0x7f) == 0); //判断接收缓存区是否为空
return URXH0;
}
void putchar(char c)
{
while (UFSTAT0 & (1<<14)); //判断发送缓存区是否已满
UTXH0 = c;
}
=====================================================================
main.c源码:
#include "uart.h"
int main()
{
char c;
init_uart();
while (1)
{
c = getchar();
putchar(c+1);
}
return 0;
}
=====================================================================
Makefile:
uart.bin: start.o main.o uart.o clock.o
arm-linux-ld -Ttext 0 -o uart.elf $^
arm-linux-objcopy -O binary uart.elf uart.bin
arm-linux-objdump -D uart.elf > uart.dis
%.o : %.S
arm-linux-gcc -o $@ $< -c
%.o : %.c
arm-linux-gcc -o $@ $< -c -fno-builtin-putc //-fno-builtin-putc避免putc函数名冲突
clean:
rm *.o uart.elf uart.bin uart.dis
上一篇:OK6410启动分析
下一篇:OK6410裸机学习之时钟设置-C语言
推荐阅读
史海拾趣
Emhiser Research非常注重创新管理和人才培养。公司建立了一套完善的研发流程和激励机制,鼓励员工提出创新性的想法和解决方案。同时,公司还积极与高校和研究机构合作,引进和培养了一批高素质的研发人才。这些人才不仅为公司带来了源源不断的创新动力,也为公司的长期发展奠定了坚实的基础。
南晶电子(DGNJDZ)成立于2011年,起初只是一家专注于半导体分立器件研发和生产的小型企业。创始人毛姬娜凭借其敏锐的市场洞察力和技术背景,带领团队攻克了一个又一个技术难关,逐渐在电子行业崭露头角。公司初期面临着资金短缺、技术瓶颈等重重困难,但毛姬娜和团队凭借坚韧不拔的精神,一步步走出了困境。
南晶电子(DGNJDZ)成立于2011年,起初只是一家专注于半导体分立器件研发和生产的小型企业。创始人毛姬娜凭借其敏锐的市场洞察力和技术背景,带领团队攻克了一个又一个技术难关,逐渐在电子行业崭露头角。公司初期面临着资金短缺、技术瓶颈等重重困难,但毛姬娜和团队凭借坚韧不拔的精神,一步步走出了困境。
南晶电子(DGNJDZ)成立于2011年,起初只是一家专注于半导体分立器件研发和生产的小型企业。创始人毛姬娜凭借其敏锐的市场洞察力和技术背景,带领团队攻克了一个又一个技术难关,逐渐在电子行业崭露头角。公司初期面临着资金短缺、技术瓶颈等重重困难,但毛姬娜和团队凭借坚韧不拔的精神,一步步走出了困境。
作为一家有社会责任感的企业,ECI始终关注环境保护和社会公益。公司积极参与各种环保活动,如节能减排、废物回收等。此外,ECI还设立了公益基金,资助贫困地区的教育事业和医疗事业。这些举措不仅提升了ECI的社会形象,也为公司赢得了更多客户的信任和支持。
随着公司规模的扩大,Fascomp开始关注更广阔的市场。公司针对智能手机市场推出了一款低功耗、高性能的处理器,迅速在市场上获得了成功。同时,公司还不断推出新的产品线,如平板电脑专用芯片、物联网设备等,以满足不同客户的需求。这些创新举措使Fascomp在激烈的市场竞争中脱颖而出。
引言随着机顶盒的设计加入更多新兴功能,如作为录象程序的硬盘、紧凑型闪存接口和视频点播 (VOD) 机器,模拟开关在这类应用中继续得以广泛采用。选用正确的开关,设计人员不仅能缩短产品面市时间来改善设计,还可以解决重要的设计难题如维持 ...… 查看全部问答∨ |
|
就32分了! 请问大侠当时用9650采集图像时采集到的数据格式是什么(rgb,ycbcr?),当时大侠把它转化成图片了吗?是什么格式的?bmp,jpeg? 是怎么做的?谢谢了!… 查看全部问答∨ |
|
一個32位的單片機器,是不是說 int32_t c, b, a; c = a + b 和unsigned char c, b, a; c = b + a; 一樣快? 是不是在程序中應該儘量使用32 bit 整數類型。… 查看全部问答∨ |
|
嵌入式系统通常为一个资源受限的系统。直接在嵌入式系统的硬件平台上编写软件比较困难,有时甚至是不可能的。下面由卓跃教育为您介绍嵌入式系统开发模式。 第一步,建立嵌入式Linux交叉开发环境。目前,常用的交叉开发环境主要有开放和商业 ...… 查看全部问答∨ |