2019-06-13 23:30:00 weixin_34246551 阅读数 37
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3400 人正在学习 去看看 朱有鹏

单片机的pin复用功能是很厉害的,比如powerpc系列的mpc5602D这一款芯片。
如果通过SIUL没有配置正确。
比如一个单片机的某个特定的pin有emios(PWM)的输出功能,同时该pin也可以有adc的功能(下文只讨论该pin)。
那么的确在有些情况下会存在adc捕获到emios的输出情况。
同时adc本来是输入的。结果由于配置的问题,对外围电路也产生了干扰。
这种bug一般不容易被用户察觉到。还以为是来自硬件的干扰。实际上是由于对SIUL的配置的bug导致一种看起来奇怪的bug。

此时只需要对siul配置正确就可以了。

转载于:https://www.cnblogs.com/praiseslow/p/11020414.html

2017-08-14 15:36:55 m0_37973607 阅读数 4265
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3400 人正在学习 去看看 朱有鹏

以STM8S105K4T6C为例,实现PB0管脚复用成TIM1_CH1N

(1)STM8S复用功能(芯片引脚加"[ ]"的功能):通过配置flash中的选项字节来实现

         除了ROP(读出保护)字节,每个选项字节必须被保存两次,一个通常的格式(OPTx)和一个用来备份的互补格式(NOPTx)

        参见STM8S105xx数据手册(如下图),可知备选功能重映射选项5(AFR5)负责管理PB0端口的重映射功能,将其设置为1即实现PB0重映射为TIM1_CH1N 

        

         

         相关代码:

          void Flash_Init()
        {
                 FLASH_DeInit();                       //恢复FLASH相关寄存器到默认值
                 FLASH_Unlock(FLASH_MEMTYPE_DATA);     //解锁数据EEPROM
                 FLASH_ProgramOptionByte(0x4803, 0x20); //选项字节  打开PB0的复用功能
                 FLASH_ProgramOptionByte(0x4804, 0xDF);
         }

(2)TIM1_CH1N是TIM1_CH1的互补输出比较

          TIM1_CH1N是TIM1_CH1的反相,可用于TIM1的同步PWM模式

          当只选择TIM1_CH1N输出PWM时,需要Disable输出比较,Enable互补输出比较

          相关代码:

          void Time1_Init()
        {
                   CLK->CKDIVR=0x00;
                   TIM1_TimeBaseInit(1599,TIM1_COUNTERMODE_UP,5000,0); //分频1600,向上计数,TIM1_ARR=20000,重复计数器为0
                  /*OC1初始化:PWM1模式
                                     输出不使能
                             互补输出使能
                             CCR1=8000,占空比为50%
                             输出有效极性为高(无作用
                             互补输出有效极性为高 
                             空闲时输出高(无作用)
                             空闲时互补输出高 
                      */
                     TIM1_OC1Init(TIM1_OCMODE_PWM1, 
                                      TIM1_OUTPUTSTATE_DISABLE, 
                                      TIM1_OUTPUTNSTATE_ENABLE, 

                              5000, 
                              TIM1_OCPOLARITY_HIGH, 
                              TIM1_OCNPOLARITY_HIGH, 
                              TIM1_OCIDLESTATE_SET, 
                              TIM1_OCNIDLESTATE_SET);
     
                      TIM1_OC1PreloadConfig(ENABLE);
                      TIM1_CtrlPWMOutputs(ENABLE); //PWM输出使能
                      TIM1_Cmd(ENABLE); //定时器开始计数 
             }


选项字节的配置一般有两种方式:

(1)使用STlink修改选项字节

          打开STVP进行相关设置,可参见

          https://wenku.baidu.com/view/205181b2d0d233d4b14e69fa.html

          点击打开链接

(2)通过程序修改选项字节

          实现程序擦Option Bytes时,不能运行程序,否则会出现错误

          一般不建议通过程序修改选项字节,容易出错

2017-08-25 13:29:44 m0_37973607 阅读数 529
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3400 人正在学习 去看看 朱有鹏

    这里以STM8S105K4T6C为例:

     

    上图中引脚“[ ]”内的功能表示复用功能,要使用复用功能必须通过选项字节配置(具体配置可参见点击打开链接)。假设这里我们要使用PB0脚的复用功能TIM1_CH1N,我们需要将flash中的选项字节OPT2的选项位AFR5置1,这时PB0、PB1、PB2、PB3这四个端口都将启用复用功能,如果这时你想要使用PB1的AIN(ADC1_CH1)功能就会出现问题。

2011-09-21 11:54:35 wangluojisuan 阅读数 2484
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3400 人正在学习 去看看 朱有鹏
单片机的信号引脚是单片机外特性的体现,在硬件上用户只能使用引脚,通过引脚的连接组建单片机系统。PIC 8位单片机系列和MCS-51系列单片机一样,其引脚除电源
VDD、VSS为单一功能外,其余的信号引脚常是多个功能,即引脚的复用功能。常见的引脚符号和主要功能如下: 
1、CLR/Vpp 清除(复位)输入/编程电压输入。其中MCLR为低电平时,对芯片复位。该脚上的电压不能超过VDD,否则会进入测试方法。Vpp代表编程电压。 
2、SC1/CLKIN 振荡器晶体/外部时钟输入端。 
3、SC2/CLKOUT 振荡器晶体输出端,在晶体振荡方式接晶体,在RC方式输出OSC1频率的1/4信号CLKOUT。 
4、OCK1 TMRO计数器输入端,如不用,为了减少功能应接地或接VDD。 
5、ICK1 TMR1时钟输入端。 
6、IOSI  TMR1的振荡输入端。 
7、IOSO TMR1的振荡输出端。 
8、D、WR、CS 分别代表并行口读信号、写信号和片选控制线。 
9、N0~AN7 A/D转换的模拟量输入端。AN0、AN1……分别表示通道的个数。 
10、CP 捕捉/比较/脉宽调制等功能端。CCP是Capture/Compare/PWM的缩写。有的PIC芯片内有两个CCP部件,其引脚用符号CCP1和CCP2表示。 
11、CK/SCL 同步串行通信时钟输入端。 
12、X/CK 异步通信发送端/SCI同步传输的时钟端。 
13、DI/SDA SPI通信数据输入端。 
14、D0 SPI通信数据输出端。 
15、D0/PSP0~RD7/PSP7 D口,双向可编程,亦可作为并行口。作并行口对TTL输入,作I/O口时为斯米特输入。 
2019-04-27 22:02:45 lin_strong 阅读数 401
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3400 人正在学习 去看看 朱有鹏

嵌入式码农小明最近在研发一个嵌入式产品,用的MC9S12XEP100芯片。其中三个需求需要通过几个使用SPI通讯的芯片实现。

硬件开发人员小红照着芯片原理图布好了线,不知是否是没考虑到SPI通讯可以通过CS line来控制要通讯的从机从而实现总线,也许就是为了省事吧。最终的测试板子是三个芯片分别对应了MC9S12XEP100的SPI0、SPI1、SPI2。

这个需求难不倒小明,SPI早都写好驱动模块了https://blog.csdn.net/lin_strong/article/details/79361503,剩下的就是看着每个芯片的手册实现对应的协议就完事了。

好多天时间,小明对着一个个芯片的芯片手册写好了对应的驱动,(没有硬件前也可以用TDD的方式先写驱动哦)。

不久板子做好了,小明照着小红给的引脚对应关系配置SPI,测试驱动代码和实际芯片。第一个成功。第二个成功。第三个…

明显是失败了呀!不然哪来这篇博文呀。

一番焦头烂额的排插问题,各种万用表示波器齐上阵,最终发现:

woc,SPI2怎么不工作? 照理来说,只要SPI0没问题,其他两个口也不应该有问题的。因为这个的驱动写法是根据相对偏移量操作对应寄存器组的(使用了C结构体内存分布的相关知识,详情就不谈了),只要每个SPI寄存器组的起始地址设对了,就不应该错。或者要对一起对,要错一起错。检查了下,并没有发现哪里有错。改不同的SPI口,初始化后的结果也完全一致。实属见鬼了。

看SPI对应的引脚,小红给的是PH4 - PH7(这里是112封装的图,还有144和80引脚的封装就不放了):

唔,也没错呀。但它咋么就不干活呢?

绝望中翻起了数据手册:

PH7同时可以做SCI5的TX引脚,也可以做SPI2的片选引脚。小明并没用SCI5,而且上面也说了,如果同时都使用了的话,SPI2优先,怎么着都没问题呀。。

再度陷入绝望。鬼使神差下小明专门搜了SPI2这关键字,搞不好这个模块有什么特殊之处呢? 然后,惊奇的发现:

emmm,怎么又有一个SPI2的引脚。 测测PP的波形。还真是! 果然驱动没写错!

仔细回去瞧一瞧引脚图。诶。还真PP4-7上也写着SPI2的相关功能。

那这到底什么鬼,是怎么决定实际用的是哪个引脚的?

(下面是正篇)


MC9S12XEP100的大部分引脚都有复用功能,即可以实现多个功能,当然,一次最多只能选择一种功能来用。在datasheet的第二章:端口集成模块中有详细的介绍。主要是几张表,
在这里插入图片描述

一个端口上可能有多种功能,当同时使能多个功能时,越上面的功能优先级越高。可以看到,通用IO功能永远是最垫底的hh。

那剩下的问题就是多个引脚都有同一个功能时怎么办。具有这个问题的功能包括CAN0, CAN4, SPI2-0, SCI7-3, IIC0, TIM 和CS[3:0]。可以看到前面的端口P和H的详细介绍中,SPI前加了一个route修饰词,路由。

所以可以通过设置某个寄存器将这个功能路由到不同的端口。这几个寄存器分别是MODRR、PTRRR、PTLRR和PTFRR。



在表2-40中我们找到了SPI的路由,我们可以看到,通过设置MODRR的bit 6我们可以决定SPI2的引脚要路由到PH还是PP上去,默认的0的时候是对应着PP4-PP7。

这不就和我们的开头小故事对上了么!于是乎,小明在程序中加入了一句。

MODRR_MODRR6 = 1;

果真SPI2在PH口上起作用了!


注:以上故事根据今天发生的真实故事改编。

单片机复用IO点灯

阅读数 105

没有更多推荐了,返回首页