本帖最后由 逗倪豌儿 于 2016-10-24 09:32 编辑
# 1.时钟配置说明 #
对每次 FLASH 读或取指操作,系统为 FLASH存储器提供一个内部 FLASH 读选通信号。FLASH读选通信号持续一或两个系统时钟周期,由 FLRT(PFE0CN.4)决定。如果系统时钟大于 25 MHz,则 FLRT 位必须被设置为逻辑 1,否则,从 FLASH读取的数据或指令不是实际的 FLASH内容。
更新 FLRT步骤如下
- 第一步:设置SFRPAGE地址为 PFE0CN页地址(0X10) 即 mov SFRPAGE, #10h
- 第二步:
如果系统时钟SYSCLK小于等于25M 则
禁止指令预取引擎(PFE0CN寄存器中的 PFEN位清 0),设置 PFE0CN.5 = 0
FLASH读选通信号为一个系统时钟 设置 PFE0CN.4 = 0 即mov SFRPAGE, #10h
如果系统时钟SYSCLK大于 25 MH 则
使能指令预取引擎(PFE0CN寄存器中的 PFEN位清 0),设置 PFE0CN.5 = 1
FLASH读选通信号为两个系统时钟 设置 PFE0CN.4 = 1 即mov PFE0CN, #30h
- 第三步:设置 SFRPAGE页地址为 00H。即 mov SFRPAGE, #00h
所以时钟配置程序如下 :
- ;****************************** 设置系统时钟为24M *****************************
- ;
- ; 1:时钟源为 HFOSC1 (48M) ,然后配置为 2分频
- ; 2
- ;
- ;*****************************************************************************
- Set_MCU_Clk_24MHz MACRO
- mov CLKSEL, #13h; Set clock to 24MHz
- mov SFRPAGE, #10h
- mov PFE0CN, #00h; Set flash timing for 24MHz
- mov SFRPAGE, #00h
- mov Clock_Set_At_48MHz, #0
- ENDM
复制代码- ;****************************** 设置系统时钟为48M *****************************
- ;
- ; 1:时钟源为 HFOSC1 (48M) SYSCLK 为 clock source(原时钟的1分频)
- ; 1:
- ;
- ;*****************************************************************************
- Set_MCU_Clk_48MHz MACRO
- mov SFRPAGE, #10h
- mov PFE0CN, #30h; Set flash timing for 48MHz
- mov SFRPAGE, #00h
- mov CLKSEL, #03h; Set clock to 48MHz
- mov Clock_Set_At_48MHz, #1
- ENDM
复制代码
## 1.1页寄存器使用说明 ##
你所用的每个寄存器都有个寄存地址,而寄存器页的页码就是指向你的寄存地址的。当你需要使用某个寄存器时,就必须把SFRPAGE指向你所要用的寄存器页上面去
举例如下:
- void Init_ADC0()
- {
- char SFRPAGE_SAVE = SFRPAGE; // 保存当前的SFR页
- SFRPAGE = ADC0_PAGE; //把页码改到以下几个寄存器所在的页码
- ADC0CN = 0x00; // 每次向AD0BUSY 写1 时启动ADC0 转换
- REF0CN = 0x03; // ADC0电压基准取自VREF0引脚,内部电压基准缓冲器工作
- AMX0CF = 0x00; // AIN inputs are single-ended (default)
- AMX0SL = 0x00; // 选择ADC 输入为AIN0.0
- // ADC0CF = (SYSCLK/SAR_CLK) << 3; // ADC 转换时钟 = 2.5MHz
- ADC0CF |= 0x00; // PGA 增益 = 1 (默认)
- // EIE2 |= 0x02; // 允许ADC0 转换结束中断
- SFRPAGE = SFRPAGE_SAVE; //回复寄存器页
- }
复制代码
这个程序中char SFRPAGE_SAVE = SFRPAGE; 和 SFRPAGE = SFRPAGE_SAVE; 是使在调用这个子函数后页码能够回到调用前的页码
----------
# 2.脉冲捕获--获取油门值说明 (Get_Rcp_Capture_Values) #
函数说明
- 1:脉冲捕获使用定时器0,计数周期 41.67ns;
- 2:该函数是在定时器 0中断中执行。
操作步骤如下:
- 1:关闭定时器0
- 2:保存计数值 Temp1 = TL0 Temp2 = TH0 Temp3 = Timer0_X (该值在定时器0中断中被自加)
- 3:如果定时器0和其他的中断同时产生了,那么定时器0会被挂起,如果被挂起则把Temp3++, 否则 Temp3 保持原来的值
- 4:把定时器0 计数器清0 即TL0 =0 TH0 = 0
- 5:把 Timer0_X 清零,即 Timer0_X = 0
- 6:从新使能定时器 0
- 7: 如果48M Temp1 = Temp1 *2 Temp2 = Temp2 *2 Temp3 = Temp3 *2,如果不是 Temp1 Temp2 Temp3 保持原有值
该函数的作用是读取脉冲捕获的计数器值 参数返回放到 Temp1 和 Temp2 中
----------
# 3. PCA初始化函数说明 -- Initialize_PCA #
说明:
- 1: 使能PCA0
- 2: PCA0时钟选择系统时钟
- 3: 如果延时为0 如果48M,则设置PCA0为11位PWM ,否则设置为10位模式 ,设置PWM 边沿对齐
- 4: 如果延时不为0 如果48M 则设置PCA0为10位PWM ,否则设置为9位模式 , 设置PWM 中间对齐
----------
# 4.上电PWM模式设置--Enable_Power_Pwm_Module #
说明:
1. 如果延时为0 使能比较器CPM0,使能匹配功能, 使能PCA为PWM模式
2. 如果延时为0 使能比较器CPM0, 禁能匹配功能, 使能PCA为PWM模式
代码如下 :
- Enable_Power_Pwm_Module MACRO
- IF FETON_DELAY == 0
- mov PCA0CPM0, #4Ah ; Enable comparator of module, enable match, set pwm mode
- ELSE
- mov PCA0CPM0, #42h ; Enable comparator of module, set pwm mode
- ENDIF
- ENDM
复制代码 ----------
# ADC 初始化函数 -- Initialize_Adc #
说明:设置采样频率为 2M
- 1:设置VDD作为电压基准,使能内部温度传感器
- 2:设置ADC转换clk = PCLK/(REF0CN >>3 -1) ,所以,
如果是48M 则48/ (B9H >>3 -1)= 2.18M
如果是24M 则24/ (59h >>3 -1)= 2.4M
- 3:设置ADC增益为 1倍
代码如下 :
- Initialize_Adc MACRO
- mov REF0CN, #0Ch; Set vdd (3.3V) as reference. Enable temp sensor and bias
- IF MCU_48MHZ == 0
- mov ADC0CF, #59h; ADC clock 2MHz, PGA gain 1
- ELSE
- mov ADC0CF, #0B9h ; ADC clock 2MHz, PGA gain 1
- ENDIF
- mov ADC0MX, #10h; Select temp sensor input
- mov ADC0CN0, #80h ; ADC enabled
- mov ADC0CN1, #01h ; Common mode buffer enabled
- ENDM
复制代码
|