终于轮到俺的小穆出场啦。有请能让太阳也为之暗淡的小穆闪亮登场~,鼓掌吧,欢呼吧!~~
♪♪ We can burn brighter Than the sun ~~~ ♪♪
“谢谢~~~“ 唱的太棒啦,再来首~~  再来首~~  
”谢谢大家,为大家表演《遮天蔽日》魔术“ 
!@%&……¥%!@!@#……¥@#¥%@#¥!@!!%%……¥%……&¥(咒语)
 
 ... .... 场内一片漆黑,只看到3个省略号~~~
番茄或鸡蛋可以丢,硬东西可乐罐之类不要丢啊!划伤俺小穆可爱的脸,哼哼~和你们拼命!
好吧,不玩啦~!
 
对小穆来说,PWM输出那是小菜一碟。小穆对木?嗯嗯!哇咔咔~~~ 连代码都不用写就能实现的喔!。
 
可以直接通过TIM中的设置,实现PWM的输出!
“啥??PWM?PWM是什么东东??”
“怎么连这个都不知道!! 就是小穆唱歌的节拍呗。”
官方点就是“脉宽调制”,这可是个很有用的东西,很多东西都可以用这进行调节。如马达的转速,当然还能调节LED亮度。具体可以搜搜网上有非常详尽的说明。
 
拿出《小穆妹纸攻略手册》,找到TIM2-TIM5。
上面的是TIM2 到 TIM5 的原理图。手册上TIM1排在前面,感觉怪怪的。TIM1前面扣这一顶“高级”的帽子,那货对俺来说高级功能暂时不用,所以直接忽视→_→。TIM2的图比较简单。
小穆现在不在!偷偷告诉你,俺看了这图N遍啊~N遍~~,才有了大致了解。女人心海底针,想要了解真不容易。
 
看看,这个图要比时钟配置简单多了。按照上面俺把她划分成三块。
  1、RCC输入                         ---  为产生节拍提供基准
  2、时基单元                         ---  小穆的心跳节拍器,1/4拍是多长呢?
  3、捕获比较输入输出通道    ---  跟随着节拍,唱出你的快乐吧。
看着图就能知道,俺的小穆有多强大。一个时钟能同时控制4路通道,就是4个IO口~\(≧▽≦)/~啦啦啦。蓝色区域左手边是监听耳麦(输入捕获的),右手边是麦克风(比较输出的)。
“通道在那个IO引脚上?”
“打开MicroXplorer,设置TIM1-4 为PWM输出,所有通道对应IO一目了然。这太简单了,比看葵花宝典清晰不知道多少倍!”
 
 
按照刚才看妹纸使用手册,就大致能知道怎么处理过程。主要6步就能搞定。
 
PWM设置步骤
  1、确定那个TIM输出PWM
  2、使能总线 IO口和TIM
  3、使能IO口,设置复用输出
  4、使能TIM,设置输出比较模式
  5、设置时基TIM寄存器
  6、设置TIM产生通道的相关寄存器
 
按照上面的步骤还是很多,寄存器一大把。抓头发吧~~~ 大头了吧~~。俺有个超级法宝“IDE调试器”,这个东东可以居家旅行必备神器。PWM是直接通过配置获得,这种情况下。嘿嘿~~ 直接运行空程序,进入调试状态。小弟用KEIL,所以...
 
 
控程序当然也不是完全空,至少已经设置好晶振。这个是小穆妹纸标准行头(模板),拥抱小穆妹纸第一季的珍贵遗产。
整个代码设置基本的时钟单元,int main(void) 函数就只有让小穆无限劳碌命的一句话。
 
----------------------------------------
#define STM32F10X_MD
#include <stm32f10x.h> void SystemInit(void)
{
unsigned char dump = ; // 使用外部8MHz晶振,启用PLL设置系统时钟为 72HMz
// USB 可用
// APB1 低速总线 36HMz
// APB2 高速总线 72HMz
RCC->CFGR = 0x001D0402;
RCC->CR = 0x01010083; // 闪存访问延迟,48MHz ~ 72MHz = 010。 复位值:0x30
FLASH->ACR = 0x32; // 确定外部高速晶振起效
while (!(RCC->CR>>));
// 确定PLL设置起效
while (!(RCC->CR>>));
// 确定PLL为系统时钟源
while(dump != 0x02) {
dump = RCC->CFGR >> ;
dump &= 0x03;
}
} int main(void)
{
while ();
}

----------------------------------------

译开关 STM32F10X_MD
    这个模板只适合 STM32F101~3 Flash 64~128K,具体参见参考手册(RM0008 V14 英文版)第2.2章。中文版没找到类似说明,应该是翻译版版本太旧。STM头文件中也有类似说明,可以直接删除此行,就能定位到。第一季里有详细说明。
 
启动调试后所有小穆妹纸的心思,那是一目了然。
 
如俺想打开TIM2通道2的PWM进行输出。按照下面红色圈圈的位置打开设置,想要的PWM的设置完成啦。可以看到那些寄存器的值,就是最终需要设置的结果哦。这竟然时如此之的简单。
 
 
想看看效果这容易,打开逻辑分析界面。就能看到有条线在上下跳动。
1、打开逻辑分析界面,
2、打开设置对话框
3、加入需要监视的引脚(如:PORTA.1) 
4、设置按BIT(电平方式)显示。颜色改个热辣的
 
“我什么都没看到。”
“我就看到一坨颜色”
“难道就是传送中国王的新衣,只有聪明的人才能看到?"
 “图片圈圈2位置,右边→_→看,有个Zoom,点点下面 缩小(In) 或 放大(Out)试试。应该就能看到。”
 “还是看不到?"
看来要找找问题,监视的引脚不对?TIM使使能没?IO口使能没?总线使能没?重头到尾过一遍。
 
按照上面的设置,可以看到实际原理图大致对应寄存器位置。
 
 
“PWM输出多少频率还是不清楚?”
“第四和第五个圈圈,是设置实际频率的位置。”
每次从1数到100,到100后从头再数。这个就是“时基单元”干的活。至于想用啥鸟语数,这个俺不管啦,反正小穆听得懂就行。
数到多少让小穆脉动一下呢,如到50后脉动一下?设置“捕获比较寄存器” 。那么数到50后,小穆用犀利的眼神盯着我,让给买奶茶。
“那设置0呢,或是俺调皮一下设成101,或999999,会发生什么情况?”
“好吧,我太牛了。试试会发生什么事情!”
 
数数还有很多方法,如倒着数,顺着数,双数数...,那种能让你心动,就可以用那种。想了解更多,参见葵花宝典!反正我只要顺着数就行了。
 
玩够了,俺准备直接把这些值使用盖世神功“啃秋四,啃秋五”全部抄袭下来。
----------------------------
int main(void)
{
unsigned int x, y;
unsigned char iDir;
unsigned int pwmwidth; // 总线 TIM2 和 A组引脚 使能
RCC->APB1ENR = 0x00000001;
RCC->APB2ENR = 0x00000004;
// PA1 脚使用复用输出,打开TIM2第二通道
GPIOA->CRL = 0x444444A4;
// 设置自动重载计数器
TIM2->ARR = ;
// 设置PWM
// 通道2 PWM模式1
// 设置比较输出
// 设置比较脉冲宽度
TIM2->CCMR1 = 0x6000;
TIM2->CCER = 0x0030;
TIM2->CCR2 = 0x0000;
// 设置为比较输出,使能TIM2
TIM2->CR2 = 0x0030;
TIM2->CR1 = 0x0001; iDir = ;
pwmwidth = ; while ()
{
// 延迟
//for (iDelay=0; iDelay < 1; iDelay++)
for (x=; x < ; x++)
for (y=; y < ; y++)
; if (iDir) pwmwidth++;
else pwmwidth --; if (pwmwidth > ) iDir = ;
else if (pwmwidth < ) iDir = ; if (pwmwidth == ) TIM2->CCR2 = ;
else if (pwmwidth == ) TIM2->CCR2 = ;
else if (pwmwidth == ) TIM2->CCR2 = ;
else if (pwmwidth == ) TIM2->CCR2 = ;
}
}

通过PWM设置让LED切换亮度

------------------❤-----浪--------漫-------分-------割-------线-----❤------------------
 
免责声明:
   上面只是测试用代码不能作为正式代码使用。这种臭臭的coding,只有天知道写是是什么鸟玩意。当然如果你想让自己在几天后,完全不知道写的是啥,这是个不错好方法。
 
代码风情
   好的代码总是很优雅的,犹如妹纸的曲线。能让别人一看就知道你的思路。当然这个要求可能比较高,但是一定要有这个目标在。一般对硬件操作有2中,一种是用官方提供的库,一种是直接操作寄存器的。
    第一种 固件库 (☆推荐
        使用库方法,很多教学中都基本都会使用。优点是不用关心寄存器易于移植可读性高。有一套标准的函数命名规范,非常容易记忆。优点很多,小问题也是有的。函数库版本问题,容易困扰初学者。对公司级应该这不是很大问题。
 
    第二种 直接寄存器操作
        测试代码中的例子是粗暴型控制寄存器的方法,还种是相对固件库类似的方法。用常量定义控制寄存器。在头文件中都会有定义寄存器相关的常量。命名规则和固件库函数命名规则一致。这种方式代码的可读性要比粗暴型的高很多。如打开TIM1时钟 TIM2->CR1 |= TIM_CR1_CEN 这句话肯定要比 TIM2->CR1 |= 1  更容易理解。
 
    可能你会问,为什么我要中这种自己都不推荐的方法来coding?其实也是蛮简单的,本身有一定的工程开发经验,xx模式之类有一定了解。所以更想侧重了解硬件,粗暴型控制能更容易了解硬件。后续代码还是以直接操作寄存器,当然不是数字型粗暴模式,而是常量型温柔模式。原有百年不变的东西(模板),直接忽视→_→。
 
    在整个产品中硬件控制只是一部分,还有一部分是功能实现。团队合作那么就要以团队为准,如果就你一个人项目就看你自己的拿捏。自己的代码风格对以后影响深远。
 
    具体相关的代码风格的文章很多,这里提就是怕被我带坏。只能忍痛在妹纸篇里插播免责声明。
 
------------------❤-----浪--------漫-------分-------割-------线-----❤------------------
 
(⊙o⊙)…~~ 跑题啦!小穆拉长了脸,写着一脸的讨厌。( ˇˍˇ )
 
用个LED做个测试瞅瞅,效果如何。
 
嗯嗯,效果不错。
 
 
 
相关资料
    MicroXplorer      --- ST官网上有
    第一季工程模板   --- http://pan.baidu.com/s/1c0w4INQ
    葵花宝典              --- ( 中文参考手册被指侵犯版权,8能共享,亲们自己网上搜)
 

拥抱ARM妹纸第二季 之 第二次 约会需要浪漫,这么大灯泡怎么弄?的更多相关文章

  1. 拥抱ARM妹纸第二季 之 第三次 给我变个月亮,让约会更浪漫!

    嗯嗯,效果不错.趁着这个热乎劲,接到俺的LED测试板上试试.呃~~~ 竟然和小LED的效果不一样啊,不一样.不但闪烁而且完全没有调光效果.郁闷内,查查原因呗.看看那里出问题.迅速在PT4115手册里翻 ...

  2. 拥抱ARM妹纸第二季 之 第一次 点亮太阳

    上次做鱼缸LED灯时还有很多材料正好拿来用.穆等等哥- 俺去找材料. 材料列表     3W LED   x  3     散热片     x  1     恒流IC     x  1     其他零 ...

  3. 《Java入门第二季》第二章 封装

    什么是java中的封装1.封装的概念:隐藏信息.隐藏具体的实现细节. 2.封装的实现步骤: 1)修改属性的可见性,private.2)创建修改器方法和访问器方法,getXXX/setXXX.(未必一定 ...

  4. 拥抱ARM妹子第二季 之 序:我和春天有个约会 - 生命的萌芽

      春姑年轻轻的吻了一下小穆妹纸的额头!从沉睡中苏醒的小穆妹纸,缓缓伸了个懒腰--- 啊-- 睡得真香! 等--等-等-!好像和童话故事里的情节不一样,应该由王子我来亲吻睡梦中的妹纸才能醒!!-- 强 ...

  5. QQ聊天界面的布局和设计(IOS篇)-第二季

    QQChat Layout - 第二季 本来第二季是快写好了, 也花了点功夫, 结果gitbook出了点问题, 给没掉了.有些细节可能会一带而过, 如有疑问, 相互交流进步~. 在第一季中我们完成了Q ...

  6. 《舌尖上的中国》第二季今日首播了,天猫食品也跟着首发,借力使力[bubuko.com]

    天猫旗下的天猫食品与央视CCTV-1栏目<舌尖上的中国>第二季(以下简称“舌尖2”)达成合作,天猫食品成为舌尖2独家合作平台,同步首发每期 节目中的食材和美食菜谱,舌尖2摄制组还将为同步上 ...

  7. 一起做RGB-D SLAM 第二季 (一)

    小萝卜:师兄!过年啦!是不是很无聊啊!普通人的生活就是赚钱花钱,实在是很没意思啊! 师兄:是啊…… 小萝卜:他们都不懂搞科研和码代码的乐趣呀! 师兄:可不是嘛…… 小萝卜:所以今年过年,我们再做一个S ...

  8. JAVA入门第二季(mooc-笔记)

    相关信息 /** * @subject <学习与创业>作业1 * @author 信管1142班 201411671210 赖俊杰 * @className <JAVA入门第二季&g ...

  9. Big Data 應用:第二季(4~6月)台湾地区Game APP 变动分布趋势图

    图表简介: 该示意图表示了台湾地区第二季内所有Game APP类别的分布情形,经由该图表我们可以快速的了解到在这三个月内,哪类型的APP是很稳定:抑或者哪类型的APP是非常不稳定的. 名词解释: 类别 ...

随机推荐

  1. Gvim 在进行文件对比时报cannot read or write temp files

    本机环境为win7 64位旗舰版,gvim安装的是GVim7.4.解决办法如下: 在安装目录下有个"_vimrc"文件.修改19行.将 if &sh =~ '\<cm ...

  2. Solr中初学Demo

    import java.util.Collection; import java.util.Date; import org.apache.solr.client.solrj.SolrQuery; i ...

  3. python连接字符串的方式

    发现Python连接字符串又是用的不顺手,影响速度 1.数字对字符进行拼接 s=""  #定义这个字符串,方便做连接 print type(s) for i in range(10 ...

  4. JavaScript中的getBoundingClientRect()方法

    这个方法返回一个矩形对象,包含四个属性:left.top.right和bottom.分别表示元素各边与页面上边和左边的距离. getBoundClientRect()方法返回的对象中和CSS中所定义不 ...

  5. html5 Canvas API

    详细内容请点击 1.HTML Canvas API有两方面优势可以弥补:首先,不需要将所绘制图像中的每个图元当做对象存储,因此执行性能非常好:其次,在其他编程语言现有的优秀二维绘图API的基础上实现C ...

  6. 【CSS3】---text-overflow 与 word-wrap

    text-overflow用来设置是否使用一个省略标记(...)标示对象内文本的溢出. 语法: 但是text-overflow只是用来说明文字溢出时用什么方式显示,要实现溢出时产生省略号的效果,还须定 ...

  7. EventDemoandStyleDemoandThemeDemo

    Event Handling 示例: 分为EventListener. EventListenerRegistration和EventHandler. 注册Event的三种方法: 1)  在Activ ...

  8. Part 7Handling events in AngularJS

    Let us understand with an example. Here is what we want to do. 1. Display the list of technologies i ...

  9. Android之开源项目view篇

    本文转自:http://www.trinea.cn/android/android-open-source-projects-view/ 主要介绍Android上那些不错个性化的View,包括List ...

  10. Warning: session_start() [function.session-start]: Cannot send session cookie解决办法

    在很多时间使用了session就会出来如下提示了, Warning: session_start() [function.session-start]: Cannot send session coo ...