搜索
bottom↓
回复: 39

重新开贴 3合一学习之 stm8系列学习讲解

[复制链接]

出0入0汤圆

发表于 2009-6-26 22:22:33 | 显示全部楼层 |阅读模式
ST 3合一开发板stm8学习之 CSS
              作者:萧星
早就听说了ST的STM8S和STM32, 一直没有机会试试。 最近看见ST又再搞推广活动, 就从微芯力科公司优惠购买了ST MCU的三合一开发板套件(STM32最小系统,STM8S开发板和STLINK)。并从他们的工程师处获得了一些代码和技术支持。不敢专享其美。写了些心得,与大家分享。   

一 程序简介:
  该工程主要涉及到gpio和rcc,tim部分,工程实现的功能是系统时钟内部和外部的切换已验证系统时钟的的安全性,当外部时钟失效时 会自动切换到内部时钟运行
  时钟特征:
1 强大的控制器,更容易得到高性能的同时保证功率最低
2 可独立管理的时钟源,都带有分频器  没有倍频 可以得到更高精度的时钟
3 可靠的无障碍时钟切换机制。程序运行中可以切换时钟源
4 抗干扰时钟配置寄存器,大部分时钟寄存器有一个互补寄存器,如果不匹配就会产生复位(系统自动完成)
  时钟源:
1—24m外部晶振
外部时钟信号 最高24m  //以上为HSE
16m高速内部rc振荡器  // HSI
128k低速振荡器        //LSI

言归正传  看我的程序:
  程序的现象是下载运行后,四个led会按照tim中断的频率 循环依次点亮,此时如果破坏外部晶振,时钟源会自动切换到内部时钟,现象是led点亮间隔变大了。

二  程序配置:
1. Led----gpio
void GPIO_Init(void)  
{
  LED1-3===PD0 PD1 PD3     
      
    PD_DDR |= 0x0D;              /*8位寄存器DDR用来配置io口的输入输出模式,每一位对应相应名称的io口  
这里我们配置 0, 1, 3位为输出 (1为输出,0为输入). 即 00001011==0D          */
    PD_CR1 |= 0x0D;              /* CR1配置输入输出模式下的
功能,在输出模式下为 :
0 开漏输出
1 推免输出                 */
    PD_CR2  = 0x00;              /* 输出最大速度到2MHz
1:配置为10m. */
}
请看stm8手册  gpio部分
    请参看附件




   Io配置的知识:
推挽输出与开漏输出的区别:
>>推挽输出:可以输出高,低电平,连接数字器件。
                     输出 0 时,N-MOS 导通,P-MOS 高阻 ,输出0。
                     输出 1 时,N-MOS 高阻,P-MOS 导通,输出1(不需要外部上拉电路)。
>>开漏输出:输出端相当于三极管的集电极. 要得到高电平状态需要上拉电阻才行. 适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内).
                     输出 0 时,N-MOS 导通,P-MOS 不被激活,输出0。
                     输出 1 时,N-MOS 高阻, P-MOS 不被激活,输出1(需要外部上拉电路);此模式可以把端口作为双向IO使用。
     

   

2.LED--时钟配置:

void CLK_Init(void)
{
    /* Configure clock prescaler */
    CLK_CKDIVR = 0x01;          /*分频时钟源  */
    /* To select external source by automtic switch */
    CLK_SWCR |= 0x02;            /* 使能转化 */
    CLK_SWR   = 0xB4;            /* 时钟源选择 选择HSE*/
                 
    while (!(CLK_SWCR & 0x08));  /* 等待直到转换完成 */
                 
                 
    if (CLK_CMSR != 0xB4)        检测是不是配置的时钟源
                    while(1);
/*以上是配置时钟源  只是单单的选择时钟源

CLK_CSSR |= 0x01; 这句才是本历程的关键 使能时钟安全机制  因为它检测的只是外部时钟  所以才有上面配置时钟源的程序,因为默认情况下是HSI/8
注:MCU 一但使用了辅助时钟源 即使外部时钟正常也切换不回去了  直到下一次复位。
}
结合程序看下图
  请参看附件
  

3.LED---tim
Stm8拥有6个定时器 其中
       Tim1 16高级定时器
       Tim 2 3 5  16位通用定时器
       Tim 4 6    8位基本定时器
本程序用的是tim4 8位的
void TIM_Init(void)
{
    /* TIM4 Peripheral Configuration */  
    /* Time Base configuration */
    TIM4_PSCR = 0x04;              /* 分频值 =16. */
    TIM4_ARR  = 0xFF;              /* 重载入值 */

    /*TIM4 counter enable */
    TIM4_CR1 |= 0x01;              /* 开启tim4 */
    TIM4_IER |= 0x01;              /*开启计数更新中断. */

}
Tim4 功能较少 配置相对简单
  主要功能:8位向上计数自动重装
            3位可编程预分频
            中断 计数中断
Tim6还有输入信号同步和检测中断 功能。

Ok  到这里这个程序功能就说完了。
转自:与非门  http://www.stmcu.org/bbs/article_394_70205.html

出0入0汤圆

 楼主| 发表于 2009-6-26 22:22:56 | 显示全部楼层
附 推免和开漏的特性
开漏电路特点及应用
    在电路设计时我们常常遇到开漏(open drain)和开集(open collector)的概念。所谓开漏电路概念中提到的“漏”就是指MOSFET的漏极。同理,开集电路中的“集”就是指三极管的集电极。开漏电路就是指以MOSFET的漏极为输出的电路。一般的用法是会在漏极外部的电路添加上拉电阻。完整的开漏电路应该由开漏器件和开漏上拉电阻组成。如图1所示:   
  
组成开漏形式的电路有以下几个特点:
1. 利用 外部电路的驱动能力,减少IC内部的驱动。当IC内部MOSFET导通时,驱动电流是从外部的VCC流经R pull-up ,MOSFET到GND。IC内部仅需很下的栅极驱动电流。如图1。
2. 可以将多个开漏输出的Pin,连接到一条线上。形成 “与逻辑” 关系。如图1,当PIN_A、PIN_B、PIN_C任意一个变低后,开漏线上的逻辑就为0了。这也是I2C,SMBus等总线判断总线占用状态的原理。
3. 可以利用改变上拉电源的电压,改变传输电平。如图2, IC的逻辑电平由电源Vcc1决定,而输出高电平则由Vcc2决定。这样我们就可以用低电平逻辑控制输出高电平逻辑了。
4. 开漏Pin不连接外部的上拉电阻,则只能输出低电平(因此对于经典的51单片机的P0口而言,要想做输入输出功能必须加外部上拉电阻,否则无法输出高电平逻辑)。
5. 标准的开漏脚一般只有输出的能力。添加其它的判断电路,才能具备双向输入、输出的能力。
应用中需注意:
1.   开漏和开集的原理类似,在许多应用中我们利用开集电路代替开漏电路。例如,某输入Pin要求由开漏电路驱动。则我们常见的驱动方式是利用一个三极管组成开集电路来驱动它,即方便又节省成本。如图3。
2. 上拉电阻R pull-up的 阻值 决定了 逻辑电平转换的沿的速度 。阻值越大,速度越低功耗越小。反之亦然。
   Push-Pull输出就是一般所说的推挽输出,在CMOS电路里面应该较CMOS输出更合适,应为在CMOS里面的push-pull输出能力不可能做得双极那么大。输出能力看IC内部输出极N管P管的面积。和开漏输出相比,push-pull的高低电平由IC的电源低定,不能简单的做逻辑操作等。push-pull是现在CMOS电路里面用得最多的输出级设计方式。  
at91rm9200 GPIO 模拟I2C接口时注意!!
一.什么是OC、OD
集电极开路门(集电极开路 OC 或源极开路OD)
open-drain是漏极开路输出的意思,相当于集电极开路(open-collector)输出,即ttl中的集电极开路(oc)输出。一般用于线或、线与,也有的用于电流驱动。
open-drain是对mos管而言,open-collector是对双极型管而言,在用法上没啥区别。
开漏形式的电路有以下几个特点:
1.利用外部电路的驱动能力,减少IC内部的驱动。 或驱动比芯片电源电压高的负载.
2.可以将多个开漏输出的Pin,连接到一条线上。通过一只上拉电阻,在不增加任何器件的情况下,形成“与逻辑”关系。这也是I2C,SMBus等总线判断总线占用状态的原理。如果作为图腾输出必须接上拉电阻。接容性负载时,下降延是芯片内的晶体管,是有源驱动,速度较快;上升延是无源的外接电阻,速度慢。如果要求速度高电阻选择要小,功耗会大。所以负载电阻的选择要兼顾功耗和速度。
3.可以利用改变上拉电源的电压,改变传输电平。例如加上上拉电阻就可以提供TTL/CMOS电平输出等。
4.开漏Pin不连接外部的上拉电阻,则只能输出低电平。一般来说,开漏是用来连接不同电平的器件,匹配电平用的。
5.正常的CMOS输出级是上、下两个管子,把上面的管子去掉就是OPEN-DRAIN了。这种输出的主要目的有两个:电平转换和线与。
6.由于漏级开路,所以后级电路必须接一上拉电阻,上拉电阻的电源电压就可以决定输出电平。这样你就可以进行任意电平的转换了。
7.线与功能主要用于有多个电路对同一信号进行拉低操作的场合,如果本电路不想拉低,就输出高电平,因为OPEN-DRAIN上面的管子被拿掉,高电平是靠外接的上拉电阻实现的。(而正常的CMOS输出级,如果出现一个输出为高另外一个为低时,等于电源短路。)
8.OPEN-DRAIN提供了灵活的输出方式,但是也有其弱点,就是带来上升沿的延时。因为上升沿是通过外接上拉无源电阻对负载充电,所以当电阻选择小时延时就小,但功耗大;反之延时大功耗小。所以如果对延时有要求,则建议用下降沿输出。
二.什么是线或逻辑与线与逻辑?
   在一个结点(线)上, 连接一个上拉电阻到电源 VCC 或 VDD 和 n 个 NPN 或 NMOS 晶体管的集电极 C 或漏极 D, 这些晶体管的发射极 E 或源极 S 都接到地线上, 只要有一个晶体管饱和, 这个结点(线)就被拉到地线电平上.  
因为这些晶体管的基极注入电流(NPN)或栅极加上高电平(NMOS), 晶体管就会饱和, 所以这些基极或栅极对这个结点(线)的关系是或非 NOR 逻辑. 如果这个结点后面加一个反相器, 就是或 OR 逻辑.
注:个人理解:线与,接上拉电阻至电源。(~A)&(~B)=~(A+B),由公式较容易理解线与此概念的由来 ;
如果用下拉电阻和 PNP 或 PMOS 管就可以构成与非 NAND 逻辑, 或用负逻辑关系转换与/或逻辑.
注:线或,接下拉电阻至地。(~A)+(~B)=~(AB);
这些晶体管常常是一些逻辑电路的集电极开路 OC 或源极开路 OD 输出端. 这种逻辑通常称为线与/线或逻辑, 当你看到一些芯片的 OC 或 OD 输出端连在一起, 而有一个上拉电阻时, 这就是线或/线与了, 但有时上拉电阻做在芯片的输入端内.  
顺便提示如果不是 OC 或 OD 芯片的输出端是不可以连在一起的, 总线 BUS 上的双向输出端连在一起是有管理的, 同时只能有一个作输出, 而其他是高阻态只能输入.
三.什么是推挽结构
一般是指两个三极管分别受两互补信号的控制,总是在一个三极管导通的时候另一个截止.要实现线与需要用OC(open collector)门电路 .如果输出级的有两个三极管,始终处于一个导通、一个截止的状态,也就是两个三级管推挽相连,这样的电路结构称为推拉式电路或图腾柱(Totem-pole)输出电路(可惜,图无法贴上)。当输出低电平时,也就是下级负载门输入低电平时,输出端的电流将是下级门灌入T4;当输出高电平时,也就是下级负载门输入高电平时,输出端的电流将是下级门从本级电源经 T3、D1 拉出。这样一来,输出高低电平时,T3 一路和 T4 一路将交替工作,从而减低了功耗,提高了每个管的承受能力。又由于不论走哪一路,管子导通电阻都很小,使RC常数很小,转变速度很快。因此,推拉式输出级既提高电路的负载能力,又提高开关速度。供你参考。
推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小 效率高。
输出既可以向负载灌电流,也可以从负载抽取电流

出0入0汤圆

 楼主| 发表于 2009-6-26 22:23:27 | 显示全部楼层
ST  3合一开发板stm8学习之 uart
作者:萧星
程序功能:
接受超级终端输入的值 并显示出来

还得说点上次的 时钟的问题,因为后面可能很少看到配置时钟的部分 所以有必要澄清一下初始化时的状态------1.内部高速rc振荡器提供时钟源  16m
                  2.时钟分频为8
                  3.供cpu的时钟是his/8

Ok,现在大家对芯片默认状态有了一点了解,下面开始串口的研究。

Stm8的串口:主要功能:
          1:支持异步传输所以成为UART          2
          2:lin模式 主从
          3 红外编码模式
          4 智能卡模拟功能
   以上功能并不是所有串口都支持,stm8最多的是3个串口
也不多说 串口应该是大家很熟悉的一种接口,怎么配置 要配置什么 也都很清楚 我就简单说一下配置的地方:
      1 数据位
      2停止位
      3波特率
      4使能发送或者接受模块(要中断功能的使能中断|)
这样uart就配置好了 可以发送和接收数据了
说几个主要标志位:
发送端:TXE  
硬件置一  说明数据从寄存器移到了 移位寄存器 传输开始了,下一个数据可以写入寄存器了,此时如果使能相应中断 中断将会产生
        TC   
数据传输完成置位 在停止位i从移位寄存器发送完后tc置位
  TXE和TC有什么区别?后面我说了一下自己的想法

        接受部分:RXNE置一 接收端移位寄存器的值放到了寄存器中,接收完成可以读取接受的数据。相应中断标志位置位时产生中断。RXNE必须在下一个数据接收完成前清零,读接受寄存器和软件直接写0都可以清除该位。
其他扩展功能 请参考stm8 手册

     Ok 现在通过程序 我们来看一下串口的通信配置过程:
   配置串口
    LINUART_CR1  = 0x00;CR1配置了很多的东西,数据位 校验位 校验中断等  这里配置为8为数据位 无校验 无校验中断
    LINUART_CR3  = 0x00;   配置了 停止位 数据相位和极性(同步模式下,用来同步的)但是此处禁止了同步功能  配置为一个停止位
    LINUART_BRR2 = 0x0B;   
    LINUART_BRR1 = 0x08;   这两个寄存器是配置串口波特率  总共是16位 :BRR1是16位中的中间8位,BBR2低4位是16位中的低四位,高4位是16位的高四位
                            这里我们配置为115200  即 16m/115200==139==0x008B
    LINUART_CR2  = 0x0C; CR2用来配置接受使能和中断使能的寄存器,这里配置为接受发送使能

Ok  到此配置完成

  发送接受程序:
     while(1)
    {
      
      printf("\nLINUART Example :Please press 1 key from keyboar
         下面 会给出内部程序

      for (i=0;i<10000;i++);//一段延时
      while (!(LINUART_SR & 0x20));//等到接受寄存器 不为空 SR中的RXEN位

     
      RxBuffer  = LINUART_DR;  //读取接受的值 同时清除RXEN位
      printf("Key Pressed = %c.\n",RxBuffer);//打印输入的值
    }

Ok  看一下 printf的 函数:
  char putchar (char c)
{
    if (c == '\n')
    {
      
      while (!(LINUART_SR & 0x40)); 等到发送完成再发送
      LINUART_DR = ('\r');
      /* Wait transmission is completed */
      while (!(LINUART_SR & 0x40));
    }

   
    while (!(LINUART_SR & 0x80));  等到数据移到移位寄存器
    LINUART_DR = (c);
    /* Wait transmission is completed */
    while (!(LINUART_SR & 0x80));

    return (c);
}
关于 TC和RXEN感觉使用上没什么区别。唯一的区别就是每个字符的发送间隔不一样了。不知道理解对不对 这个向高手请教。


附上 lin的讲解:
LIN简介
LIN协会创建于1998年末,最初的发起人为五家汽车制造商,一家软件工具制造商以及一家半导体厂商。该协会将主要目的集中在定义一套开放的标准,该标准主要针对车辆中低成本的内部互联网络(LIN, local interconnect networks),这些地方无论是带宽还是复杂性都不必要用到CAN网络。LIN标准包括了传输协议的定义、传输媒质、开发工具间的接口、以及和软件应用程序间的接口。LIN提升了系统结构的灵活性,并且无论从硬件还是软件角度而言,都为网络中的节点提供了相互操作性,并可预见获得更好的EMC(电磁兼容)特性。
LIN补充了当前的车辆内部多重网络,并且为实现车内网络的分级提供了条件,这可以有助于车辆获得更好的性能并降低成本。LIN协议致力于满足分布式系统中快速增长的对软件的复杂性、可实现性、可维护性所提出的要求,它将通过提供一系列高度自动化的工具链来满足这一要求。
LIN总线的主要特性为:
*单主站以及多从站概念;
*基于常用的UART/SCI硬件接口,以及相应的软件,或作为纯粹的状态机,从而保证较低的成本;
*从节点中无须石英或陶瓷振荡器就可以实现自同步;
*信号传输实体确定,在增强系统中可以计算信号的传播(propagation)时间;
*信号基于应用交互层。
LIN网络由一个主节点以及一个或多个从节点组成,媒体访问由主节点控制--从节点中不必有仲裁或冲突管理。可以保证最差状态下的信号传输延迟时间。
LIN物理层
总线驱动/接收器的定义遵循ISO 9141单线标准,并带有一些增强性能。总线为单线传输,"与"总线通过终端电阻由电池正极节点(VBAT)提供。总线收发器采用增强型的ISO 9141实现标准。总线可以取两个互补的逻辑值:主控值其电压接近于接地端,代表逻辑值"0",退让值其电压与电池电压接近,代表逻辑值"1"。
总线采用上拉电阻作为终端,主节点的上拉电阻为1kOhm,从节点的上拉电阻为30kOhm。电阻需串联一个二极管以防止由于本地电源泄漏对总线产生的干扰。从节点的终端电容通常值为 CSlave= 220pF,主节点的电容要更高以使整个总线的电容小于从节点的值。
由于采用单线媒质传输,最大的传输波特率被限定在20kbit/s以内。该值为从满足信号同步而不产生冲突的最高值,到为满足电磁兼容性要求而要达到的传输最低值之间的实验中间值。最小的传输波特率为1kbit/s--这有助于避免在实际中产生超时冲突。  
LIN协议
通过LIN总线传输的实体为帧。一个报文帧由帧头以及回应(数据)部分组成。在一个激活的LIN 网络中,通讯通常由主节点启动,主节点任务发送包含有同步间隙的报文头,同步字节以及报文标志符(ID)。一个从节点的任务通过接收并过滤标志符被激活,并启动回应报文的传送。回应中包含了1到8个字节的数据以及一个字节的校验码。
传输一帧所花费的总的时间是发送每个字节所用的时间,加上从节点的回应间隙,再加上传输每个字节的间隙时间(inter-byte space)。字节间隙是指发送完前一个字节的停止位后到发送下一个字节的启动位之间的时间。
帧内部间隔(inter-frame space)是从上一帧发送完毕后到下一帧启动发送间的时间间隔。
帧的结构如图1所示。帧由帧间间隔以及接下来的4到11个字节域组成。
  
图1:帧结构
信号在帧的数据域中传送。多个信号可以打包在一个帧中传送,只要这些信号不彼此重叠即可。
每个信号只有一个明确的传输者,例如,通常由一簇(cluster)节点中的一个来写,0、1或多个节点订阅该信号。

LIN协议的核心特性是使用进度表(schedule table)。进度表有助于保证总线不出现过载的情况,他们同样是保证信号定期传输的核心组件。
在一组LIN节点中只有主节点任务才可以启动通讯保证了行为的确定性。主节点有责任保证与操作模式相关的所有帧都必须分配了足够长的传输时间。
LIN应用
采用LIN可实现车内网络分级,从而成为车辆制造商提供更高的质量及更低成本的重要因素。它可以为工业领域的软件开发提供最好的实现方式:抽象及更好的组合能力。LIN可以简化很多现有的低端复合解决方案,并且可以降低车辆电子系统的开发、生产、服务及后勤成本。
采用配备LIN的轿车生产线正在快速增长,而下一代轿车雄心勃勃的计划也许是LIN成功的最好证明。简捷而完整的LIN规范包含了完整的网络概念,极高的自动化程度已经使LIN和CAN成为了车内通讯网络的主干。一部分市场增长甚至出现在车内网络部分减少的地方。
2003年发布的LIN 2.0规范增强了组件在不同车辆生产厂商间的通用性,并且通过引入节点能力描述文件(Node Capability Description File)增强了自动化设计能力,同时还对同一网络中的相同LIN设备定义了重配置机制。

出0入0汤圆

 楼主| 发表于 2009-6-26 22:29:34 | 显示全部楼层
点击此处下载 ourdev_456318.rar(文件大小:56K) (原文件名:CSS.rar)
点击此处下载 ourdev_456319.rar(文件大小:42K) (原文件名:UART.rar)

出0入0汤圆

 楼主| 发表于 2009-6-26 22:30:26 | 显示全部楼层
转一个 stm8 建工程说明  应该是微芯力科写的
  图文讲解
  http://www.stmsky.com/bbs/viewthread.php?tid=16&extra=&page=1

出0入0汤圆

 楼主| 发表于 2009-6-29 11:42:17 | 显示全部楼层
顶上

出0入0汤圆

发表于 2009-6-29 12:16:35 | 显示全部楼层
DING

出0入0汤圆

发表于 2009-6-29 17:28:17 | 显示全部楼层
不错的东西

出0入0汤圆

发表于 2009-7-2 12:21:28 | 显示全部楼层
好,向楼主学习.

出0入0汤圆

 楼主| 发表于 2009-7-7 14:44:49 | 显示全部楼层
ST  3合一开发板stm8学习之 led

这个例程使用了adc tim 和 gpio三种外设,程序功能是 根据adc输入的模拟量改变led
灯闪烁的频率和灯的亮度。


配置过程:

Adc相关程序:
     void ADC_Init(void)
{
    ADC_CR2  = 0x00;  配置寄存器2 配置外部触发是否使能 选择外部触发方式 数据对齐位  扫描模式是否使能位  这里配置为禁止外部触发 转换数据左对齐  禁止扫描模式?
    ADC_CR1  = 0x00;  配置寄存器1 配置预分频位 转换模式是单词还是连续 ad转换开关。这里配置为fadc=fmaster/2,单次转换,禁止adc
    ADC_CSR  = 0x03; 控制状态寄存器:配置各种中断使能 转换完成标志和转换通道。这里配置了 禁止各种中断 选择通道3 pb3
       ADC_TDRL = 0x20; ADC_TDRH和ADC_TDRL寄存器可以用来禁止 AIN 模拟输入引脚中的施密特触发器工作。禁止施密特触发器工作可以降低I/O引脚的功耗。


还有很多寄存器 具体用到可以看相关说明
}

Gpio相关  

void GPIO_Init(void)
{
    /* LED IO Configuration        */
    /* LD3: PD3             */    请看gpio 讲解部分
    /* LD2: PD1             */
    /* LD1: PD0             */
    PD_DDR |= 0x0D;              /*      前面            */
    PD_CR1 |= 0x0D;              /*          已经      */
    PD_CR2  = 0x00;              /* */    讲过

    /* 外部中断pd7 */
    EXTI_CR1  = 0x00;           配置 触发方式 这里配置为下降沿和低电平触发      
    EXTI_CR2  = 0x00;           中断触发方式 下降沿和低电平触发
    PD_DDR   &=~0x80;          pd7输入模式
    PD_CR2   |= 0x80;            使能pd7外部中断
}

Tim相关:

void TIM_Init(void)
{
    /* TIM2 CC2控制亮度 */
    TIM2_CCMR2 |= 0x70;         配置为pwm2模式,PWM模式2- 在向上计数时,一旦TIMx_CNT<TIMx_CCR2时通道2为无效电平,否则为有效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR2时通道2为有效电平,否则为无效电平。
     TIM2_CCER1 |= 0x30;         /*选择通道2  输出低电平 有效    */
    TIM2_ARRH   = 0x00;
    TIM2_ARRL   = 0xff;        /* 配置重装载数值       ARRH默认值是ff      */
    TIM2_CCR2   = 0x00;        /* 输出比较2的值  用来和cnt比较 这
里开始为零  输出到引脚的电平是零
(有效电平) pwm2模式        */

    TIM2_PSCR   = 0x00;          /*预分频器的值  值+1            */
    TIM2_CR1   |= 0x01;           使能计数  cr1最高位使能预装载功能
此处禁止
以上配置了 tim2 通道2为pwm2模式 (在向上计数时,一旦TIMx_CNT<TIMx_CCR2时通道2为无效电平,否则为有效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR2时通道2为有效电平,否则为无效电平。)
  并配置了重装载数值和预分频值,开启计数。关于计数模式  应该只有向上计数模式。

下面是配置tim3  通道1  
                    */
/* TIM3 CC1 控制闪烁*/
    TIM3_CCMR1 |= 0x78;      配置为 pwm2模式  开启预装载功能
    TIM3_CCER1 |= 0x03;           /* 选择通道1      */
    TIM3_ARRH   = 0x03;
    TIM3_ARRL   = 0xff;         
    TIM3_CCR1H  = 0x02;              
TIM3_CCR1L  = 0x00;

    TIM3_PSCR  |= 0x0d;            
TIM3_CR1   |= 0x81;

}

配置tim3和 tim2一样 不再多说。
定时器 用得最多的就是定时和产生不同的波形,基本的定时 我们就可以直接设成计数模式就ok了。输出比较和pwm如初一折

以上设置开启输出捕获功能并打开相应通道,设置低电平为有效电平
void ADC_Init(void)
{
    ADC_CR2  = 0x00;
    ADC_CR1  = 0x00;
    ADC_CSR  = 0x03; 选择模拟通道3输入
    ADC_TDRL = 0x20; 关闭相应管教施密特触发器
}
设置adc位  单次转换 转换数据左对齐存储。选择模拟通道3输入,关闭相应管教施密特触发器(整波的),



Ok  以上配置了led的gpio端口以及外部触发中断的端口,定时器两个比较输出。和adc单次转换输入。看一下主程序:
void LED_Control(unsigned char duration)
{
    int i = 0;
    unsigned char uc = 0;
    unsigned long Temp;

    ADC_CR1 |= 0x01;      
     i = 6;           
    while(i--);
    ADC_CR1 |= 0x01;        
    while(!(ADC_CSR & 0x80));/* Waiting for AD convert finished (EOP=1).
     
开启adc需要给ADON两次赋值,第一次开启adc的供电,等到电源稳定,则再赋值,开始转换
    /* Store ADC value to AD_Value */
    AD_Value = ((((unsigned int)ADC_DRH)<<2)+ADC_DRL);

    /* The new duty cycle value is written in CCR. */
    TIM2_CCR2H=0x00;
    TIM2_CCR2L=(unsigned char)(AD_Value>>2);
根据adc的值改变比较寄存器的值,因为tim2 用来改变亮度 所以低电平时间要短

    if (AD_Value>0x10)
    {
      Temp=(unsigned char)(AD_Value>>8);

      if ((TIM3_ARRH>Temp+0x05)||(TIM3_ARRH<Temp-0x05))
      {
        TIM3_ARRH  = Temp;
        TIM3_ARRL  = (unsigned char)(AD_Value&0xff);
        TIM3_CCR1H = (unsigned char)(AD_Value>>9);
        TIM3_CCR1L = (unsigned char)((AD_Value>>1)&0xff);
      }
}

当转换值大于0x10时,灯闪烁  并一直变化。
    /* Delay time = duration * Y */
    while ( uc < duration )  /* The following loop is run "duration" times. */
    {
      while ( i < 1200 )     /* This loop "Y" waits approximately 4.3ms.      */
      {
        i++;
      }
      i = 0;
      uc++;
    }
上面是延时函数
}

Ok 关于led例程  到此为止

出0入0汤圆

发表于 2009-7-9 08:54:01 | 显示全部楼层
学习

出0入0汤圆

发表于 2009-7-10 14:18:21 | 显示全部楼层
谢谢

出0入0汤圆

发表于 2009-7-11 15:21:54 | 显示全部楼层
http://www.stmsky.com/bbs/viewthread.php?tid=16&extra=&page=1

出0入0汤圆

发表于 2009-7-11 16:33:04 | 显示全部楼层
cool~

出0入0汤圆

发表于 2009-7-28 09:51:16 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-7-28 10:33:00 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-10-20 23:41:10 | 显示全部楼层
good!

出0入0汤圆

发表于 2009-10-21 08:29:51 | 显示全部楼层
标记

出0入0汤圆

发表于 2009-11-16 14:21:33 | 显示全部楼层
太棒了,一定得顶。。

出0入0汤圆

发表于 2010-1-6 11:46:52 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-6-21 17:59:53 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-6-21 18:36:50 | 显示全部楼层
正在学习STM8中。。。。

出0入0汤圆

发表于 2010-7-23 14:15:24 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-7-23 17:00:08 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-8-23 23:43:58 | 显示全部楼层
学习中,谢谢!

出0入0汤圆

发表于 2010-9-18 23:16:20 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-9-28 17:23:48 | 显示全部楼层
mark...........

出0入0汤圆

发表于 2010-10-1 22:44:49 | 显示全部楼层
mark
头像被屏蔽

出0入0汤圆

发表于 2010-10-2 07:33:45 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

发表于 2010-10-2 09:17:42 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-3 18:26:38 | 显示全部楼层
回复【29楼】armok 阿莫
我最反感转载文章时,为省时间不转图片。
楼主就属于这种情况。 这样的转载,不转也罢,浪费我们论坛的空间,败坏了这里的风气。

-----------------------------------------------------------------------
同意,一般看到这种文章我只能说搜索原文然后看原文,因为看这种明明写了如图所示却没图片的文章完全摸不着头脑~

出0入0汤圆

发表于 2010-10-4 11:01:33 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-8-10 19:31:41 | 显示全部楼层
没有图片 看得一头雾水!

出0入0汤圆

发表于 2012-8-10 19:48:03 | 显示全部楼层
good               

出0入0汤圆

发表于 2012-8-11 15:47:15 | 显示全部楼层
初学stm8。。。标记一下。。

出0入0汤圆

发表于 2013-1-4 21:08:59 | 显示全部楼层
MARK 一下,以便查找。

出0入0汤圆

发表于 2013-1-4 21:10:35 | 显示全部楼层
非常好,谢谢分享。

出0入0汤圆

发表于 2013-3-9 11:16:33 | 显示全部楼层
好东西啊  记住

出0入0汤圆

发表于 2013-3-10 21:44:58 | 显示全部楼层
mark.........................
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子论坛 ( 公安交互式论坛备案:44190002001997 粤ICP备09047143号 )

GMT+8, 2022-5-24 02:00

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表