ai栗子吧 关注:102贴子:6,548
  • 10回复贴,共1

一天天学用STM8S

取消只看楼主收藏回复

好吧,我也笔记


1楼2010-12-03 09:57回复
    第一个实验就是LED闪灯
    ----------------------------
         /* LED IO Configuration     */
             /* LD4: PD0              */
             /* LD3: PD2              */
             /* LD2: PD3              */
    #include "STM8S105C_S.h"
    void delay(unsigned int count)
    {
       while(count--);
    }//延时
    void GPIO_init(void)
    {
       PD_DDR |= 0x0D;        // Output.
         PD_CR1 |= 0x0D;                 //PushPull.
         //PD_CR2   = 0x00;        //Output speed up to 2MHz. this sentence has no work,cause CR2 is 00 at first
    }
    void Devices_init(void)
    {
    GPIO_init();
    }
    main()
    {    
         Devices_init();
         while(1)
         {
         PD_ODR = 0x04;
         delay(50000);
         PD_ODR = 0x00;
         delay(50000);
         }
        
    }
    ————————————————————————————————————
    板子上的LED开始闪了,哈哈。
    1.今后代码一定养成如上的规范,先写各模块初始化函数,然后在包含在器件初始化函数中。
    2.在这个编译器里,函数定义的输入参数里一定要写清楚,空值不能空着,写明void。如void Devices_init(void)
    3.延时函数,先前用500,太快了,人眼都分辨不出来,延时长一点才有闪的效果。
    


    2楼2010-12-03 10:52
    回复
      我很无聊的弄了个流水灯,延时缩短了,哈哈,看他跑的多欢啊
      ----------------------------------
      main()
      {    
           Devices_init();
           while(1)
           {
           PD_ODR = 0x04;
           delay(10000);
           PD_ODR <<= 1;
           delay(10000);
           PD_ODR >>= 3;
           delay(10000);
           }
      }
      -------------------


      3楼2010-12-03 11:07
      回复
        实验二 修改系统时钟,改变流水灯速度
        --------------------------------
        #include "STM8S105C_S.h"
        void delay(unsigned int count)
        {
           while(count--);
        }//延时
        void CLK_init(void)
        {
             CLK_CKDIVR = 0x00;         //16MHz system clk,turn to full speed,it's reset value is /8.
        }
        void GPIO_init(void)
        {
           PD_DDR |= 0x0D;        // Output.
             PD_CR1 |= 0x0D;                 //PushPull.
             //PD_CR2   = 0x00;        //Output speed up to 2MHz. this sentence has no work,cause CR2 is 00 at first
        }
        void Devices_init(void)
        {
             CLK_init();
             GPIO_init();
        }
        main()
        {    
             Devices_init();
             while(1)
             {
             PD_ODR = 0x04;
             delay(50000);
             PD_ODR <<= 1;
             delay(50000);
             PD_ODR >>= 3;
             delay(50000);
             }
        }
        ----------------------------------------------
        把原先的延时函数还原,还是50000,通过修改分频寄存器来改变系统时钟,修改后是16Mhz的系统频率。呵呵,真的很欢快。
        修改主时钟源,还可以选择外部晶振作为主时钟源和CPU时钟分频。


        4楼2010-12-03 11:57
        回复
          ----------------------------------------
          void CLK_init(void)
          {
               CLK_CKDIVR = 0x03;         //16MHz system clk,f(CPU)turn to /8 ,it's reset value is full speed.
          }
          -----------------------------------------
          CPU时钟8分频,RC振荡器全速,这样的结果就同单单RC振荡器8分频的效果一样了


          5楼2010-12-03 12:05
          回复
            实验三:蜂鸣器发声
            配置了BEEP所在的PD4为PUSHPULL,写BEEP_CSR=0x2E。
            可是运行后,蜂鸣器没声音,上论坛也问了。。。于是怀疑是不是LSI模式还要设置,或者还要LS校验,查了MANUAL,只要BEEP使能,LSI是自动进入的。。。
            后来发现蜂鸣器居然是有源的。。。真是万万没想到。。。这块板是STM8S105S4-PKT,是代理商那边拿到的评估板。。。板子有提供一个MUSIC代码,而且用户手册也说“通过板上的蜂鸣器体验STM8S内置的蜂鸣器驱动单元”。。。
            是不是某家公司借去用了,无源的坏了,然后换了个有源的。。。晕死。。。
            无源蜂鸣器代码
            -------------------------------------------------------
            main()
            {    
                PD_DDR |= 0x10;        // Output.
            PD_CR1 |= 0x10;     //PushPull.
            while(1)
            {
            BEEP_CSR = 0x2E;
            }
            }
            -----------------------------------------
            有源的情况就跟LED一样了。。。


            6楼2010-12-06 16:55
            回复
              第四个实验-I2C通信-主机接收
              ----------------------------------------------------
              #include "STM8S105C_S.h"
              #define LED_flash()   {PC_ODR |= 0x80; delay(50000);PC_ODR = 0x00;}
              void delay(unsigned int count)
              {
                  while(count--);
              }//延时
              void GPIO_init(void)//PC7 HIGH-LED LIGHT
              {
                   PC_DDR |= 0x80;         // Output.
                   PC_CR1 |= 0x80;                  //PushPull.
                   //PD_CR2    = 0x00;         //Output speed up to 2MHz. this sentence has no work,cause CR2 is 00 at first
              }
              void I2C_init(void)
              {
                   PB_ODR = 0x00;                 //define SDA, SCL outputs, HiZ, Open drain, Fast
                 PB_DDR |= 0x30;
              //   PB_CR2 |= 0x30;
              //     I2C_FREQR = 0x10;
              //     I2C_CCRH    = 0;     //标准I2C接口
              //     I2C_CCRL     = 0x10;
                  
                 I2C_FREQR = 8;                 // input clock to I2C - 8MHz
                 I2C_CCRL = 40;                 // CCR= 40 - (SCLhi must be at least 4000+1000=5000ns!)
                 I2C_CCRH = 0;                  // standard mode, duty 1/1 bus speed 100kHz
                 I2C_TRISER = 9;                // 1000ns/(125ns) + 1   (maximum 1000ns)
                 I2C_OARL = 0xA0;               // own address A0;
                 I2C_OARH |= 0x40;
                 I2C_ITR = 1;                   // enable error interrupts
                 I2C_CR2 |= 0x04;               // ACK=1, Ack enable
                 I2C_CR1 |= 0x01;               // PE=1
                   I2C_CR2    &= 0x08;  
              }
              void Devices_init(void)
              {
                   GPIO_init();
                   I2C_init();
              }
              void I2C_start(void)
              {
                   unsigned char temp;
                   while(I2C_SR3 & 0x02);
                   /*
                   {
                   I2C_CR2 |= 0x02;                             // STOP=1, generate stop
              


              7楼2011-05-18 10:24
              回复
                     while(I2C_CR2 & 0x02);
                     }     //等待总线空闲
                     */
                     I2C_CR2 |= 0x01;                                 //产生起始位
                     while(!(I2C_SR1 & 0x01));           //等待START发送完
                     I2C_DR = 0x86;                      //发送从器件地址
                     while(!(I2C_SR1 & 0x02));           //等特7位器件地址发送完
                     temp = I2C_SR1;
                     temp = I2C_SR3;
                }
                void Read_slave(void)
                {
                     unsigned char temp,key;
                     while(!(I2C_SR1 & 0x02)); //等待从机发送完数据
                     temp = I2C_SR1;
                     temp = I2C_SR3;
                     key = I2C_DR;
                }
                void main()
                {
                     unsigned char key;
                     Devices_init();
                    
                     LED_flash();
                     delay(50000);
                     I2C_start();
                     LED_flash();
                    
                     while(1)
                     {
                         Read_slave();
                         if(key == 0x01)
                         {
                             LED_flash();
                         }
                     }
                }
                ------------------------------------
                不知道为什么,总线一直是BUSY,即使SDA和SCL都是低电平了
                ------------------------------------------------------------------
                athlon64fx发表于 2011-3-20 09:35 | 只看该作者 回复 引用 评分 报告 返回版面 TOP   得分:0
                45楼: 我在STM8上也遇到了问题,看了下errata,i2c必须使用中断,中断必须最高优先级。还是模拟算了。
                --------------------------------------------------------
                询问未果,都说ST的I2C有问题,虽然我觉得我的代码问题应该比较大,但我决定先放弃硬件I2C


                8楼2011-05-18 10:24
                回复
                  //以下先把I2C 口先配置为输出口,再输出1,可以是总线物理复位,
                     //可以使调试复位的时候,上一次错误程序导致的总线错误,不会对本次调试产生影响
                     //以及其他情况引起的总线错误不会对复位以后产生影响
                  //复位时,不会I2C出错
                     GPIO_InitStructure.GPIO_Pin =   GPIO_Pin_6 | GPIO_Pin_7;
                     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
                     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
                     GPIO_Init(GPIOB, &GPIO_InitStructure);
                    
                     GPIOB->BSRR = GPIO_Pin_6;// =1
                     GPIOB->BSRR = GPIO_Pin_7;// =1
                     ////再配置为I2C功能口/////
                     GPIO_InitStructure.GPIO_Pin =   GPIO_Pin_6 | GPIO_Pin_7;
                     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
                     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
                     GPIO_Init(GPIOB, &GPIO_InitStructure);
                      /* Enable I2C1 reset state */
                     RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, ENABLE);
                     /* Release I2C1 from reset state */
                     RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, DISABLE);


                  9楼2011-05-18 10:31
                  回复
                    - -
                    不搞STM8了,现在没用这的项目。等以后再玩吧


                    12楼2012-02-27 20:03
                    回复
                      那你来这里看的这么起劲哈。。。你应该从最简单的51单片机学起。。。买个小开发板 一个个实验做过去 熟悉各个模块


                      14楼2012-03-03 21:13
                      回复