有2种方法,第一种可以用代码来设置,我封装的一个函数
typedef enum{
AFR7_PD4_BEEP=(uint8_t)0x80,
AFR6_PB4_5_I2C_SDA_SCL=(uint8_t)0x40,
AFR5_PB3_2_1_0_TIM1_ETR_CH2_1_0=(uint8_t)0x20,
AFR4_PD7_TIM_CH4=(uint8_t)0x10,
AFR3_PD0_TIM1_BKIN=(uint8_t)0x08,
AFR2_PD0_CLK_CCO=(uint8_t)0x04,
AFR1_PA3_TIM3_CH1_PD2_TIM2_CH3=(uint8_t)0x02,
AFR0_PD3_ADC_ETR=(uint8_t)0x01
}Remap_Function_TypeDef;
/*******************************************************************************
* 名称: AlternateFunctionRemapping
* 功能: 选功能重映射的设置
* 形参: Function 需要重映射的功能
* 返回: 无
* 说明: 如果调试需要打印数据的时候
在自定义宏的地方添加#define DEBUG_AFR即可,下载程序后只有第一次执行
打印出来设置前的功能才是对的,执行完之前就被写进flash,如果不修改的话,
每次都出来的数据都是一样,所以只执行一次就行了,建议用的时候,就在调
试的时候进行执行一次就可以,以后都不需要出现了,除非再次更改。
在调用AlternateFunctionRemapping函数之前需要初始化串口函数Uart_Init
这些设置写进flash,运行一次即可,在调试的时候运行即可
******************************************************************************/
void AlternateFunctionRemapping(Remap_Function_TypeDef Function)
{
uint8_t Function_temp;
FLASH_Unlock(FLASH_MEMTYPE_DATA);/*要对选项字节写操作,必须要先解锁FLASH*/
while(!(FLASH->IAPSR & FLASH_IAPSR_DUL));/*等待解锁完毕*/
/*备选功能重映射的设置可以同时写多个不会被覆盖,因此在操作之前读取当前的状态,再根据当前的状态进行修改*/
Function_temp=(uint8_t)(FLASH_ReadOptionByte(AFR_ADDRESS)>>8);
#ifdef DEBUG_AFR
printf("\r\nFunction_temp:%x\r\n",Function_temp);
#endif
while(!(FLASH->IAPSR & FLASH_IAPSR_DUL));/*等待解锁完毕*/
FLASH_ProgramOptionByte(AFR_ADDRESS,Function|Function_temp);
#ifdef DEBUG_AFR
Function_temp=(uint8_t)(FLASH_ReadOptionByte(AFR_ADDRESS)>>8);
printf("\r\nFunction_temp:%x\r\n",Function_temp);
#endif
FLASH_Lock(FLASH_MEMTYPE_DATA);/*操作完要加锁*/
}
只要调用我的这个函数就可以
恢复初始值
/*******************************************************************************
* 名称: DefaultFunctionRemapping
* 功能: 恢复默认功能的设置
* 形参: Function 需要恢复默认的功能
* 返回: 无
* 说明: 如果调试需要打印数据的时候
在自定义宏的地方添加#define DEBUG_AFR即可,下载程序后只有第一次执行
打印出来设置前的功能才是对的,执行完之前就被写进flash,如果不修改的话,
每次都出来的数据都是一样,所以只执行一次就行了,建议用的时候,就在调
试的时候进行执行一次就可以,以后都不需要出现了,除非再次更改。
在调用DefaultFunctionRemapping函数之前需要初始化串口函数Uart_Init
这些设置写进flash,运行一次即可,在调试的时候运行即可
******************************************************************************/
void DefaultFunctionRemapping(Default_Function_TypeDef Function)
{
uint8_t Function_temp;
FLASH_Unlock(FLASH_MEMTYPE_DATA);/*要对选项字节写操作,必须要先解锁FLASH*/
while(!(FLASH->IAPSR & FLASH_IAPSR_DUL));/*等待解锁完毕*/
/*备选功能重映射的设置可以同时写多个不会被覆盖,因此在操作之前读取当前的状态,再根据当前的状态进行修改*/
Function_temp=(uint8_t)(FLASH_ReadOptionByte(AFR_ADDRESS)>>8);
#ifdef DEBUG_AFR
printf("\r\nFunction_temp:%x\r\n",Function_temp);
#endif
FLASH_ProgramOptionByte(AFR_ADDRESS,Function & Function_temp);
#ifdef DEBUG_AFR
Function_temp=(uint8_t)(FLASH_ReadOptionByte(AFR_ADDRESS)>>8);
printf("\r\nFunction_temp:%x\r\n",Function_temp);
#endif
FLASH_Lock(FLASH_MEMTYPE_DATA);/*操作完要加锁*/
}
typedef enum{
AFR7_PD4_TIM2_CH1=(uint8_t)0x7f,
AFR6_PB5_AIN5_PB4_AIN4=(uint8_t)0xbf,
AFR5_PB3_2_1_0_AIN3_2_1_0=(uint8_t)0xdf,
AFR4_PD7_TLI=(uint8_t)0xef,
AFR3_PD0_TIM3_CH2=(uint8_t)0xf7,
AFR2_PD0_TIM3_CH2=(uint8_t)0xfb,
AFR1_PA3_TIM2_CH3_PD2_TIM3_CH1=(uint8_t)0xfd,
AFR0_PD3_TIM2_CH2=(uint8_t)0xfe
}Default_Function_TypeDef;
调用这个函数就可以恢复原来的设置了。
第二种方式就是用ST-LINK结合IAR设置,详情请见楼主位的9和14这2份教程,很清楚的介绍 |