![](http://uphotos.eepw.com.cn/Cigoy/thumb/avatar.jpg)
给大家贡献一个延时函数
MCU:STN32F103C8
MCU配置:8M晶振,默认时钟配置,外设APB,GPIO速度50MHz
这个延时函数可以精确到1us
后期各种驱动必备
回复可见
![](http://uphotos.eepw.com.cn/Cigoy/thumb/avatar.jpg)
串口通信
直接上代码
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); /* PA10 USART1_Rx */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure);
端口配置代码
特别注意RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);
USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_ClockInitStructure.USART_Clock = USART_Clock_Disable; USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low; USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge; USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable; USART_ClockInit(USART1, &USART_ClockInitStructure); USART_Init(USART1, &USART_InitStructure); USART_Cmd(USART1, ENABLE); USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); USART_Cmd(USART1, ENABLE);
USART1的配置代码,通过2个结构体进行配置
和老版本外设库有些不一样
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 15; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);
中断配置代码
void USART1_IRQHandler(void) { while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET) { } USART_SendData(USART1,USART_ReceiveData(USART1)); USART_ClearFlag(USART1, USART_FLAG_RXNE); }
中断服务程序,RX接收数据,送串口调试助手显示
while (1) { printf("\r\n snake0301@电子产品世界四轴飞行器DIY!!! \r\n"); delay_ms(500); }
主函数部分
基本上就是循环发送"\r\n snake0301@电子产品世界四轴飞行器DIY!!! \r\n"
如果有数据接收,进入中断,并显示所接收到的字符。
视频伺候
视频地址:http://player.youku.com/player.php/sid/XNjkzMTAxODk2/v.swf
![](http://uphotos.eepw.com.cn/Cigoy/thumb/avatar.jpg)
原理图上PWM是从PA0-PA3进行输出的
看了看的特西特,是TIM2的4路PWM
倒腾了一晚上,才把TIM2的PWM调通
着实扰人
上代码
void RCC_Configuration(void) { /* TIM2 clock enable */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); /* GPIOA and GPIOB clock enable */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO , ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); }
时钟配置部分,看上去蛮简单。
GPIO_InitTypeDef GPIO_InitStructure; /*GPIOA Configuration: TIM2 channel1, 2, 3 and 4 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1|GPIO_Pin_2 | GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO的配置,比较常规,不过要注意复用推挽输出的选择
void PWMchannel_config(int t1,int t2,int t3,int t4) { /* Compute the prescaler value */ PrescalerValue = (uint16_t) (SystemCoreClock / 24000000) - 1; /* Time base configuration */ TIM_TimeBaseStructure.TIM_Period = 665; TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); /* PWM1 Mode configuration: Channel1 */ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = t1; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM2, &TIM_OCInitStructure); TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable); /* PWM1 Mode configuration: Channel2 */ TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = t2; TIM_OC2Init(TIM2, &TIM_OCInitStructure); TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable); /* PWM1 Mode configuration: Channel3 */ TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = t3; TIM_OC3Init(TIM2, &TIM_OCInitStructure); TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable); /* PWM1 Mode configuration: Channel4 */ TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = t4; TIM_OC4Init(TIM2, &TIM_OCInitStructure); TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable); TIM_ARRPreloadConfig(TIM2, ENABLE); }
搞定一个,其他的基本上没有问题了
我这里申明了一个配置函数,为了能改变PWM的参数,来控制电机的转速
TIM_Cmd(TIM2, ENABLE); while (1) { PWMchannel_config(temp,temp+25,temp+50,temp+125); delay_ms(5000); if (temp>=250) { delay_ms(25000); temp=0; } else {temp=temp+50;} }
main函数主要的部分
上视频,有耳机,更清楚,吼吼。
视频地址:http://player.youku.com/player.php/sid/XNjkzMjQzNDI0/v.swf
![](http://uphotos.eepw.com.cn/hanshuyujifen2/thumb/avatar.jpg)
![](http://uphotos.eepw.com.cn/hanshuyujifen2/thumb/avatar.jpg)
回复
有奖活动 | |
---|---|
【有奖活动——B站互动赢积分】活动开启啦! | |
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |