本帖最后由 赤子的PCB 于 2019-4-18 08:41 编辑
首先很感谢电子发烧友提供的本次试用机会,本人今年刚刚参加工作,想要走嵌入式工程师这条路还很长,希望能像之前申请里说的那样,可以通过这块板子,了解常用元件的使用方法、PCB的布局,以及常用外设接口的设置等
今天下午回家刚刚收到板子,就迫不及待的打开了
板子的做工没说的,麻雀虽小五脏俱全,SD卡插槽,触摸按键等。最让我一惊的是PCIe接口,我有些熟悉却又不知道哪里见过这个接口,想了半天这不是电脑固态插槽吗,这也太高级了,后来看了看帖子原来是这里将串口外接了,与PCIe关系不大。 后面我就想试一下官方示例的效果,这里发生了一些小插曲,我接上电发现不亮,以为是板子有什么问题后来还问了下群里的朋友才发现是电源没有打开(捂脸)
这里还是要提醒一下使用SPI下载的同学,STM32的板子的串口ISP下载方法:Boot0接到3.3V上,Boot1接到GND,对板子重新上电,STM32单片机重启的时候,会进入到ISP模式
连接完成后就可以进行下载了,我发现官方ufun_core_test需要使用MDK for Arm Cortex-M 才能正确打开,不然会提示找不到板子,另外两个示例测试可以正常编译。要正常编译第一个示例,需要到Keil官网下载左面这个版本。
接下来就是烧写“两只老虎”的效果了
RGB灯光加“两只老虎”的音乐,可用按键来调节灯光和蜂鸣器开关,俗话说的好,学习编程最快的方式就是看别人的代码,下面让我们一起看下实现的代码吧,浏览一下主要的函数。
- #define DO 191
- #define RE 170
- #define MI 152
- #define FA 143
- #define SO 128
- #define LA 114
- #define XI 101
复制代码
首先宏定义了音符,为之后蜂鸣器发出不同频率的声音做准备,之后我们看一下定义的music函数,输入参数即为DO,RE,MI等
- void music(unsigned int a)
- {
- unsigned int b;
- b = a/2;
- tiM_SetAutoreload(TIM1,a);
- TIM_SetCompare1(TIM1,b);
- GPIO_ResetBits(GPIOA, GPIO_Pin_3);
- Delay(250);
- // TIM_SetAutoreload(TIM1,0);
- TIM_SetCompare1(TIM1,0);
- GPIO_SetBits(GPIOA, GPIO_Pin_3);
- Delay(20);
- Touch_Key_Proc();
复制代码
定时器ARR寄存器设置为a,CCR1比较寄存器被设置为a/2,输出占空比为50%的PWM波,LED3导通,延时250ms后,将CCR1置零,之后关闭LED3,进入触摸判断函数。
- void Touch_Key_Proc(void)
- { if(key0 == 1)
- {
- TIM_DeInit(TIM1);
- PrescalerValue = 79;
- Beep_Init();
- TIM_SetCompare1(TIM2,0);
- TIM_SetCompare2(TIM2,0);
- TIM_SetCompare3(TIM2,0);
- TIM_SetCompare1(TIM1,0);
- GPIO_SetBits(GPIOA, GPIO_Pin_3);
- key_state = 0;
- }
复制代码
这里是部分代码,可以清楚看到,触摸判断函数中重新初始化了TIM1定时器、蜂鸣器和LED3,每个键值唯一的改变就是,key_state的值,为后面的loop循环判断做准备,这里既然上面是公共代码,代码有些冗余,只需加if对key_state进行赋值即可,剩下的有键被按下时统一执行。
- void close(void)
- {
- TIM_SetCompare1(TIM2,0);
- TIM_SetCompare2(TIM2,0);
- TIM_SetCompare3(TIM2,0);
- }
复制代码
再来看下rgb的相关函数,通过三通道的占空设置,对R、G、B的三色光组份进行调整以发射出各种颜色的光。
- for(;;)
- {
- Touch_Key_Proc();
-
- loop:
- switch(key_state)
- {
- case 0:
- {
- Collect_Data(ACCdata);
- if((ACCdata[1] > ACCdata[0])&&(ACCdata[1] > ACCdata[2]))
- {
- red();
- }
- if((ACCdata[0] > ACCdata[1])&&(ACCdata[0] > ACCdata[2]))
- {
- green();
- }
- if((ACCdata[2] > ACCdata[0])&&(ACCdata[2] > ACCdata[1]))
- {
- blue();
- }
- } break;
复制代码
当按下按键0时,对加速度传感器的x,y,z轴三个值进行采集和判断,他们分别存储在
这个数组中,并进行相应的灯光操作
后面的case1对应一个呼吸灯操作,case2对应调速版的"两只老虎",其中每个音符之间都用下方语句来响应键值,跳回loop,虽说
但对于这种简单逻辑的程序我觉得还是很适用的.
- if(key_state != 2)
- {
- goto loop;
- }
复制代码
case3是一个rgb多色变换的操作,有兴趣的朋友可以去仔细钻研一下
希望以后有机会可以将源码重构一次,当成对自己的一次锻炼.
最后总结一下UFUN开发板,我目前所了解到的 - 优点:高密集度,是目前我见过最精巧的stm32开发板,平时都可以装在口袋里;资源丰富
- 缺点:PCIe接口有些麻烦,目前找不到好的办法将其引出
|