关于ufun开发板,之前早就下载好了资料包,但是都是基于第一版的硬件开发板,现在申请的板子是第二版新的,下载好了最新版资料,感谢社区网友,资料包下载链接:https://download.eeworld.com.cn/detail/okhxyyo/603662
资料包整体结构还是秉承之前的,结构清晰,层次分明。我们先来了解了解硬件原理图,该UFUN开发板依然采用的是以STM32103RCT6做为主控,接口丰富,功能齐全。主控的原理图如下:
再来看看主要的外部扩展接口J1的分布,在这个接口中,我们可以获得很多关键性的信息,比方说第39管脚与第40管脚通过寄过来的跳线帽连接在一起,使MCU进入烧录模式。而且我们可以知道一些SPI、I2C、UART、GPIO等常见通讯接口,这样方便我们进一步扩展其它功能。
此次分享,我们来看看PWM控制LED三基色的例子,体验一下炫酷的灯效魅力。之前第一版的开发包资料有“两只老虎”的乐谱,此次听到更美妙的音调。看看PWM与LED的连接原理图,以及蜂鸣器的原理图。
正如资料中提及到的,该UFUN开发板可以采用JLINK或者ISP方式烧录,烧录的时候需要将JI的39脚与40脚跳线帽短接,烧录完后需要撤掉跳线帽,然后就能看到编译出来的效果啦。
部分代码如下:
#include "PWM.h"
#include "LED.h"
#include "DELAY.h"
void TIM2_PWM_Init(u16 arr,u16 psc) //arr为自动重装载寄存器周期的值,psc为TIM2的预分频值
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能定时器2时钟
//初始化TIM
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
//初始化TIM Channe PWM模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
TIM_OC1Init(TIM2, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM3 OC2
TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable); //使能TIM3在CCR2上的预装载寄存器
TIM_OC2Init(TIM2, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM3 OC2
TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable); //使能TIM3在CCR2上的预装载寄存器
TIM_OC3Init(TIM2, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM3 OC2
TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable); //使能TIM3在CCR2上的预装载寄存器
TIM_Cmd(TIM2, ENABLE); //使能TIM3
TIM_ARRPreloadConfig(TIM2, ENABLE);
TIM_CtrlPWMOutputs(TIM2, ENABLE);
}
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能PA端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2; //led管脚配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO
}
void Delay_Us(u32 nus)
{
u32 temp;
SysTick->LOAD = 9*nus;
SysTick->VAL=0X00;//清空计数器
SysTick->CTRL=0X01;//使能,减到零是无动作,采用外部时钟源
do
{
temp=SysTick->CTRL;//读取当前倒计数值
}while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达
SysTick->CTRL=0x00; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}
void Delay_Ms(u16 nms)
{
u32 temp;
SysTick->LOAD = 9000*nms;
SysTick->VAL=0X00;//清空计数器
SysTick->CTRL=0X01;//使能,减到零是无动作,采用外部时钟源
do
{
temp=SysTick->CTRL;//读取当前倒计数值
}while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达
SysTick->CTRL=0x00; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}
#include "BEEP.h"
#include "DELAY.h"
void BEEP_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能PA端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //蜂鸣器引脚定义
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO
GPIO_SetBits(GPIOA, GPIO_Pin_8);
}
int scale(int i) //音阶变换函数
{
int t;
for(t=0;t<200000/i*2;t++)
{
GPIO_SetBits(GPIOA, GPIO_Pin_8);
Delay_Us(i);
GPIO_ResetBits(GPIOA, GPIO_Pin_8);
Delay_Us(i);
}
}
#include "stm32f10x.h"
#include "stdio.h"
#include "main.h"
#include "stdlib.h"
#include "BEEP.h"
#include "TOUCH_KEY.h"
#include "DELAY.h"
int main()
{
int i;
int Sheet_music[]={6,7,8,8,7,8,8,10,10,7,7,0,0,3,3,6,6,6,5,6,6,8,8,5,5,5};//乐谱
int Sheet_length=sizeof(Sheet_music) / sizeof(Sheet_music[0]); //乐谱数组长度计算
BEEP_Init(); //蜂鸣器配置
while (1)
{
for(i=0;i<=Sheet_length;i++)
{
switch (Sheet_music[i]) //音调选择
{
case 0: //空
Delay_Ms(500);
break;
case 1: //do
scale(doo);
break;
case 2: //re
scale(re);
break;
case 3: //mi
scale(mi);
break;
case 4: //fa
scale(fa);
break;
case 5: //sol
scale(sol);
break;
case 6: //la
scale(la);
break;
case 7: //si
scale(si);
break;
case 8: //高音do
scale(DO);
break;
case 9: //高音re
scale(RE);
break;
case 10: //高音mi
scale(MI);
break;
}
}
}
}
我这里采用的是JLINK工具烧录程序,JLINK工具烧录程序还是比较方便的,可以支持在线调试,容易调试解决一些逻辑上的问题。建议采用JLINK工具烧录程序。至于如何搭建JLINK烧录环境,可以网上搜搜,这里就不再赘述。体验的实例效果如下视频。此次分享就到这里,后续再对UFUN的外设做进一步的体验,谢谢!欢迎吐槽。
此内容由EEWORLD论坛网友yin_wu_qing原创,如需转载或用于商业用途需征得作者同意并注明出处