开发板是万利公司的STM32F107VC-PKT.
HSE是25Mhz晶振
LSE是32.768Mhz晶振
使用IAR的编译器.
代码如下:
BIT6 EQU 0x00000040 ;字第6个位为1
RCC_CR EQU 0x40021000 ;时钟控制寄存器
RCC_CFGR EQU 0x40021004 ;时钟配置寄存器
RCC_CFGR2 EQU 0x4002102C ;时钟配置寄存器2
RCC_CIR EQU 0x40021008 ;时钟中断寄存器
RCC_AHBRSTR EQU 0x40021028 ;AHB外设时钟复位寄存器
RCC_APB2RSTR EQU 0x4002100C ;APB2外设复位寄存器
RCC_APB1RSTR EQU 0x40021010 ;APB1外设复位寄存器
RCC_AHBENR EQU 0x40021014 ;AHB外设使能寄存器
RCC_APB2ENR EQU 0x40021018 ;APB2外设使能寄存器
RCC_APB1ENR EQU 0x4002101C ;APB1外设使能寄存器
RCC_BDCR EQU 0x40021020 ;备份域控制寄存器
RCC_CSR EQU 0x40021024 ;控制/状态寄存器
__iar_program_start ;CPU复位后从这里开始执行
main
;打开HSE
LDR R0, =RCC_CFGR2
MOVW R1, #0x0001
STR R1, [R0] ,#0 ;设置PREDIV1为2分频=12.5MHz
MOV R1, #0
LDR R1,[R0] ;读取配置寄存器2值
LDR R0, =RCC_CFGR
MOVW R1, #0x0401 ;设置为HSE时钟为系统时钟
;MOVW R1, #0x0402 ;设置AHB不分频(50M),APB1-2分频(25M),APB2-不分频(50M),SW-0x01设置为使用HSE时钟,0x02设置PLL时钟
MOVT R1, #0x0009 ;0x09是位23:16,转换B00001001,设置PLLMUL为4倍频=12.5*4=50MHz,PLLSRC=1
;MOVT R1, #0x001D ;0x15是位23:16,转换B00011101,设置PLLMUL为9倍频=12.5*7=50MHz,PLLSRC=1,触发中断
STR R1, [R0] ,#0
MOV R1, #0
LDR R1,[R0] ;读取配置寄存器值
LDR R0, =RCC_CR
MOVT R1, #0x0109
STR R1, [R0] ,#0 ;配置好参数,最后使能PLLON和HSEON,并打开CSSON
MOV R1, #0
LDR R1,[R0] ;读取控制寄存器值
;开启LSE,为什么这里LSE始终无法就绪????
LDR R0, =RCC_BDCR
MOV R1, #0x0001
STR R1, [R0] ,#0 ;设置LSEON为开启状态
;HSE时钟,可查看RCC_CFGR寄存器中的SWS和SW位
;LSE时钟,可查看RCC_BDCR寄存器中的LSERDY位始终不能就绪.
exit
B exit ;程序执行完毕,进入死循环,等待触发中断
END ;文件结束,任何函数都不能在End后面,否则B调用就找不到
通过查看SWS位看到HSE就绪.
但是LSERDY始终不能就绪,不知道是设置那个寄存器出问题了. |
|