重映射:将内置外设的输入输出端口改变到其他端口,也就不是上一次使用的端口复用
在本章中,我们将使用TIM3的通道2,把通道2重映射到PB5,产生PWM来控制DSO的亮度。
(STM32F1开发指南)P211
查表如下:

使用端口重映射的原因:
我们要利用TIM3的CH2输出PWM来控制DSO的亮度,但是TIM3_ CH2默认是接在PA7上面的,
而我们的DS0接在PB5上面,如果普通MCU,可能就只能用飞线把PA7飞到PB5上来实现了,
不过,我们用的是STM32,它比较高级,可以通过重映射功能,把TIM3_ CH2映射到PB5上。
(STM32F1开发指南)P213
LED灯的最大值可以设置到899
我们可以通过定时器重映射到LED的端口,然后通过定时器产生的脉冲宽度PWM来控制LED的亮度
灯闪范围:范围是0x00 ~ 0x99 = 0~153,超过次数就错误
TIM3定时器复用了LED0的IO接口,所以不能正常LED操作
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)
Res =USART_ReceiveData(USART1); //读取接收到的数据
if((USART_RX_STA&0x8000)==0)
{
if(USART_RX_STA>2)//5
{
USART_RX_BUF[USART_RX_STA&0X3FFF]=Res;
USART_RX_STA++;//3固定的
if(USART_RX_STA>6){
USART_RX_STA=0;
}
if(USART_RX_STA==Para_len+5)//1+3(参数位+固定3个字节) 判断是否接收完
{
USART_RX_STA|=0x8000;
}
}
//命令字节接收
else if(USART_RX_STA==1)
{
USART_RX_BUF[USART_RX_STA&0X3FFF]=Res;
USART_RX_STA++;
}
else if(USART_RX_STA==2)
{
Para_len = Res&0xffff;
USART_RX_BUF[USART_RX_STA&0X3FFF]=Res;
USART_RX_STA++;
}
//通讯头: 占1字节,表示通讯开始,通讯头固定为C5
else if(Res==0xc5&&USART_RX_STA==0)
{
USART_RX_BUF[USART_RX_STA&0X3FFF]=Res;
USART_RX_STA++;
}
}
u8 ACKR[2];
u8 i;
static u16 led0pwmval=0;
void Cmd_ack(void)
{
ACKR[0]=0xC5;
ACKR[1]=USART_RX_BUF[1];
for(i=0;i<2;i++)
{
USART_SendData(USART1,ACKR[i]);
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
}
}
void Flash_N(u8 n)//范围是0x0~99=0~153
{
for(i=0;i<n;i++)
{
delay_ms(30);
LED1=!LED1;
delay_ms(30);
}
if(i==n)
{
printf("LED灯亮了%d次",n);
}
}
void Change_N(u16 n)
{
delay_ms(10);
if(led0pwmval<n)
{
printf("变亮!\r\n");
delay_ms(10);
led0pwmval=n;
TIM_SetCompare2(TIM3,n);//这个是用来控制占比的 可以通过脉冲宽度调制pwm来控制LED灯的亮度
}
else if(led0pwmval>n)
{
printf("变暗!\r\n");
delay_ms(10);
led0pwmval=n;
TIM_SetCompare2(TIM3,n);//这个是用来控制占比的 可以通过脉冲宽度调制pwm来控制LED灯的亮度
}
else if(led0pwmval==n)
{
printf("不变!\r\n");
}
}
void Close_Led()
{
TIM_SetCompare2(TIM3,0);
LED1=1;
}
int main(void)
{
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(115200); //串口初始化为115200
LED_Init(); //LED端口初始化
TIM3_PWM_Init(899,0); //不分频。PWM频率=72000000/900=80Khz
TIM_SetCompare2(TIM3,led0pwmval);
LED1=0;
while(1)
{
if(USART_RX_STA&0x8000)
{
LED0=1;
USART_ITConfig(USART1,USART_IT_RXNE,DISABLE);
Cmd_ack();
if(USART_RX_BUF[1]==0xAA) Flash_N(USART_RX_BUF[3]);
else if(USART_RX_BUF[1]==0xBB) Change_N(USART_RX_BUF[3]);
else if(USART_RX_BUF[1]==0xCC) Close_Led();
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//开启接收中断
USART_RX_STA=0;
}
}
}