4790|0

226

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

【ufun学习】篇二:初测demo实例 [复制链接]

       关于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原创,如需转载或用于商业用途需征得作者同意并注明出处

此帖出自单片机论坛
点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表