一、
1、完整工程下載下傳連結
https://download.csdn.net/download/qcddao4/14801288
沒積分的關注收藏私信要一下。感謝。
二、硬體
基于原子的精英闆,單片機型号stm32f103zet6.
三、實作的功能
1、TIM1 輸出pwm.頻率為 1 K 。引腳用PA11。
2、TIM3 配置為外部時鐘輸入模式。引腳用PD2。使能中斷。
3、将PD2 和 PA11 短接,主函數序列槽列印 pwm脈沖個數。
4、控制TIM1 pwm 輸出 4個周期後 停止輸出。
四、效果
1、功能 3 效果
2、功能 4 效果
五、主函數和pwm 初始化 代碼
1、主函數
int main(void)
{
u16 t;
u16 len;
delay_init(); //延時函數初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設定NVIC中斷分組2:2位搶占優先級,2位響應優先級
uart_init(115200); //序列槽初始化為115200
LED_Init(); //LED端口初始化
KEY_Init(); //初始化與按鍵連接配接的硬體接口
TIM1_PWM_Init(100); //不要傳奇數 50 周期是500us 100 周期是1ms
TIM3_Init() ; //配置 TIM2_CH1_ETR 為外部脈沖計數 并且使能中斷 來一個上升沿進一次中斷
while(1)
{
if(USART_RX_STA&0x8000)
{
len=USART_RX_STA&0x3fff;//得到此次接收到的資料長度
printf("\r\n您發送的消息為:\r\n\r\n");
for(t=0;t<len;t++)
{
USART_SendData(USART1, USART_RX_BUF[t]);//向序列槽1發送資料
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待發送結束
}
printf("\r\n\r\n");//插入換行
USART_RX_STA=0;
}else
{
}
delay_ms(200);
printf("pwm脈沖個數%d \r\n",TIM_GetCounter(TIM3));
}
}
2、pwm初始化
void TIM1_PWM_Init(u16 arr )
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11 ; //|GPIO_Pin_8; //11是ch4 8 是ch1
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //複用推挽輸出 //
GPIO_Init(GPIOA,&GPIO_InitStructure);
TIM_TimeBaseInitStructure.TIM_Period = arr; //設定自動重裝載寄存器周期的值
TIM_TimeBaseInitStructure.TIM_Prescaler = 719;//設定用來作為TIMx時鐘頻率預分頻值 7199:10k
TIM_TimeBaseInitStructure.TIM_ClockDivision = 0;//設定時鐘分割:TDTS = Tck_tim
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//TIM向上計數模式
TIM_TimeBaseInit(TIM1, & TIM_TimeBaseInitStructure);
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse=arr/2;
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OCIdleState=TIM_OCIdleState_Set;
TIM_OC4Init(TIM1,&TIM_OCInitStructure);
TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable);
TIM_Cmd(TIM1,ENABLE);//ê1?ü?ò??ê§?üTIMxíaéè
//下面這句是進階定時器才有,輸出PWM必須打開
TIM_CtrlPWMOutputs(TIM1, ENABLE); //pwm輸出
}