yin_wu_qing 发表于 2019-7-19 00:53

【ufun学习】篇二:初测demo实例

<div class='showpostmsg'><p>&nbsp; &nbsp; &nbsp; &nbsp;关于ufun开发板,之前早就下载好了资料包,但是都是基于第一版的硬件开发板,现在申请的板子是第二版新的,下载好了最新版资料,感谢社区网友,资料包下载链接:<a href="https://download.eeworld.com.cn/detail/okhxyyo/603662">https://download.eeworld.com.cn/detail/okhxyyo/603662</a><br />
&nbsp; &nbsp; &nbsp; &nbsp;资料包整体结构还是秉承之前的,结构清晰,层次分明。我们先来了解了解硬件原理图,该UFUN开发板依然采用的是以STM32103RCT6做为主控,接口丰富,功能齐全。主控的原理图如下:<br />
&nbsp; &nbsp; &nbsp;再来看看主要的外部扩展接口J1的分布,在这个接口中,我们可以获得很多关键性的信息,比方说第39管脚与第40管脚通过寄过来的跳线帽连接在一起,使MCU进入烧录模式。而且我们可以知道一些SPI、I2C、UART、GPIO等常见通讯接口,这样方便我们进一步扩展其它功能。</p>

<p>&nbsp; &nbsp;此次分享,我们来看看PWM控制LED三基色的例子,体验一下炫酷的灯效魅力。之前第一版的开发包资料有&ldquo;两只老虎&rdquo;的乐谱,此次听到更美妙的音调。看看PWM与LED的连接原理图,以及蜂鸣器的原理图。</p>

<p></p>

<p>&nbsp; &nbsp; &nbsp; &nbsp;正如资料中提及到的,该UFUN开发板可以采用JLINK或者ISP方式烧录,烧录的时候需要将JI的39脚与40脚跳线帽短接,烧录完后需要撤掉跳线帽,然后就能看到编译出来的效果啦。</p>

<p>部分代码如下:</p>

<pre>
<code>#include "PWM.h"
#include "LED.h"
#include "DELAY.h"

void TIM2_PWM_Init(u16 arr,u16 psc)    //arr为自动重装载寄存器周期的值,psc为TIM2的预分频值
{
        TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;
        TIM_OCInitTypeDefTIM_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, &amp;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, &amp;TIM_OCInitStructure);//根据T指定的参数初始化外设TIM3 OC2
        TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);//使能TIM3在CCR2上的预装载寄存器
       
        TIM_OC2Init(TIM2, &amp;TIM_OCInitStructure);//根据T指定的参数初始化外设TIM3 OC2
        TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);//使能TIM3在CCR2上的预装载寄存器

        TIM_OC3Init(TIM2, &amp;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_InitTypeDefGPIO_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, &amp;GPIO_InitStructure);//初始化GPIO
}
void Delay_Us(u32 nus)
{
u32 temp;
SysTick-&gt;LOAD = 9*nus;
SysTick-&gt;VAL=0X00;//清空计数器
SysTick-&gt;CTRL=0X01;//使能,减到零是无动作,采用外部时钟源
do
{
temp=SysTick-&gt;CTRL;//读取当前倒计数值
}while((temp&amp;0x01)&amp;&amp;(!(temp&amp;(1&lt;&lt;16))));//等待时间到达
   SysTick-&gt;CTRL=0x00; //关闭计数器
    SysTick-&gt;VAL =0X00; //清空计数器
}

void Delay_Ms(u16 nms)
{
u32 temp;
SysTick-&gt;LOAD = 9000*nms;
SysTick-&gt;VAL=0X00;//清空计数器
SysTick-&gt;CTRL=0X01;//使能,减到零是无动作,采用外部时钟源
do
{
temp=SysTick-&gt;CTRL;//读取当前倒计数值
}while((temp&amp;0x01)&amp;&amp;(!(temp&amp;(1&lt;&lt;16))));//等待时间到达
    SysTick-&gt;CTRL=0x00; //关闭计数器
    SysTick-&gt;VAL =0X00; //清空计数器
}
</code></pre>

<pre>
<code>#include "BEEP.h"
#include "DELAY.h"

void BEEP_Init(void)
{
        GPIO_InitTypeDefGPIO_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, &amp;GPIO_InitStructure);//初始化GPIO
        GPIO_SetBits(GPIOA, GPIO_Pin_8);
}

int scale(int i)                                                                                        //音阶变换函数
{
        int t;
        for(t=0;t&lt;200000/i*2;t++)
        {
                GPIO_SetBits(GPIOA, GPIO_Pin_8);
                Delay_Us(i);
                GPIO_ResetBits(GPIOA, GPIO_Pin_8);
                Delay_Us(i);
        }
}
</code></pre>

<pre>
<code>#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);                                                //乐谱数组长度计算
        BEEP_Init();                                                                                                                                                                                                                                                        //蜂鸣器配置
               
        while (1)
        {       
                for(i=0;i&lt;=Sheet_length;i++)
                {
                        switch (Sheet_music)                                                                                                                                                                                                //音调选择
                        {
                                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;                                                                                          
                        }                                                                     
                }
        }       
}</code></pre>

<p>&nbsp; &nbsp; &nbsp;我这里采用的是JLINK工具烧录程序,JLINK工具烧录程序还是比较方便的,可以支持在线调试,容易调试解决一些逻辑上的问题。建议采用JLINK工具烧录程序。至于如何搭建JLINK烧录环境,可以网上搜搜,这里就不再赘述。体验的实例效果如下视频。此次分享就到这里,后续再对UFUN的外设做进一步的体验,谢谢!欢迎吐槽。</p>

<p><iframe allowfullscreen="true" frameborder="0" height="450" src="http://player.youku.com/embed/XNDI3ODY1MzMwNA" style="background:#eee;margin-bottom:10px;" width="100%"></iframe><br />
<iframe allowfullscreen="true" frameborder="0" height="450" src="http://player.youku.com/embed/XNDI3ODY1NjczNg" style="background:#eee;margin-bottom:10px;" width="100%"></iframe><br />
<br />
<em><b><font color="#5E7384">此内容由EEWORLD论坛网友<font size="3">yin_wu_qing</font>原创,如需转载或用于商业用途需征得作者同意并注明出处</font></b></em></p>
</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                                                                                (function($){
                                                        var postHeight = getTextHeight(400);
                                                        $(".showpostmsg").html($(".showpostmsg").html());
                                                        $(".showpostmsg").after(loginstr);
                                                        $(".showpostmsg").css({height:postHeight,overflow:"hidden"});
                                                })(jQuery);
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>
页: [1]
查看完整版本: 【ufun学习】篇二:初测demo实例