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

大冷天,一天天学用STM32

取消只看楼主收藏回复


好吧,为了给岳母造一个MP3,现在得抓紧迈向32位机了


1楼2010-12-18 11:23回复
    进展很慢,重装了MDK,可以调试了,玩了下流水灯。
    晚上找到了视频教程,可以先看看。


    2楼2010-12-19 23:50
    回复
      32位就是爽啊,虽然我还没体会到优越性,请给我时间
      还是习惯直接操作寄存器,所以抛开那些开发板的程序,自己抓着参考手册摸出了这个程序,这个该是最简单的程序了
      第一个实验还是从GPIO下手,点亮LED
      -------------------------------------
      #include <stm32f10x_lib.h>
      #include "stm32_reg.h"        
      void GPIO_init(void)
      {
            RCC->APB2ENR |= RCC_APB2ENR_IOPEEN;      //GPIOE外设时钟使能
            GPIOE->CRL =    0x00003333;                           //OUTPUT = 0x03
      }
      void CLK_init()
      {
            RCC->CR = 0x00010000;         //HSE ENABLE
            while ((RCC->CR & RCC_CR_HSERDY) == 0);         // Wait for HSERDY = 1 (HSE is ready)
            RCC->CFGR = 0x00000001;
            while ((RCC->CFGR & RCC_CFGR_SWS) == 0);         //HSE was selected for system_clk
      }
      main (void)
      {
            CLK_init ();
            GPIO_init();
            while(1)
            {
            GPIOE->ODR |= 0x00000001;
            }
      }
      ---------------------------
      1.DEBUG过去,开发板4个LED居然亮了三个,而我要点亮的LED2居然是灭的,和想要的结果相反。。。怀疑是ODR寄存器设置不同。。。看了半天发现,开发板的LED是低电平点亮。。。
      2.对于系统时钟一直很疑惑,不知道这几个语句的顺序,实验了下,步骤是第一步确认外部晶振OK,第二步选择HSE切换为系统时钟,对应步骤后有while的延时确认就可以了
      3.接下去得用库函数来弄了,貌似大家都这么做,应该这样工作量会轻松点。
      


      4楼2011-01-16 20:13
      回复
        关于为何例程中的main函数都是 int main(void)
        ------------------------------------
        很多C程序员都曾搞错的一个概念,就是以为这样一个函数不接受任何参数:  
        int foo();  
        事实上,这个函数被认为可以接受未知个数的参数(译:可接受任意多的参数!)。正确的用法是在括号内添加关键字void。  
        void main()函数是如何处理的?  
        在C/C++正规的调用/返回函数中,如果你不想让一个函数返回任何值,你可以使用void定义返回类型。比如,一个不接受任何参数并且无任何返回值的函数原型可以像这样:  
        void foo(void);  
        一个常见的误解是,这种逻辑同样适用于main()函数。呵呵,事实并非如此,main()函数是很特殊的,无论何时你都应该依照标准定义main()函数(译:即使用int main()的形式!),并把返回值定义为int。有时void main()的例外形式是可以出现的,但这仅限于某些特定的系统。如果你不敢肯定正在使用这些系统,那么答案很简单,不能使用void main()的形式。  
        ---------


        5楼2011-01-17 11:33
        回复
          1.现在的库STM32F10x_StdPeriph_Lib_V3.4.0把system_stm32f10x.c给独立出来,要用户自己另行添加。
          2.工程选项里必须要选择好include的路径。
          终于自己建了个工程编译成功了。


          6楼2011-01-20 19:16
          回复

            #include "stm32f10x.h"
            #include "stm32f10x_conf.h"
            void GPIO_init(void);
            void Delay(uint32_t nCount);
            //PA0-LED
            void GPIO_init(void)
            {
                 GPIO_InitTypeDef GPIO_InitStruct;
            /* Configure all unused GPIO port pins in Analog Input mode (floating input
            trigger OFF), this will reduce the power consumption and increase the device
            immunity against EMI/EMC *************************************************/
                 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |
                                      RCC_APB2Periph_GPIOC |  
            RCC_APB2Periph_GPIOD |
                                        RCC_APB2Periph_GPIOE, ENABLE);
                        
                 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_All;
                 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;
                 GPIO_Init(GPIOA, &GPIO_InitStruct);
                 GPIO_Init(GPIOB, &GPIO_InitStruct);
                 GPIO_Init(GPIOC, &GPIO_InitStruct);
                 GPIO_Init(GPIOD, &GPIO_InitStruct);
                 GPIO_Init(GPIOE, &GPIO_InitStruct);
                        
                 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |
                                      RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD |
                                      RCC_APB2Periph_GPIOE, DISABLE);
                 //Init GPIOA0
                 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
                 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
                 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
                 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
                 GPIO_Init(GPIOA, &GPIO_InitStruct);
            }
            void Delay(uint32_t nCount)
            {
               for(; nCount != 0; nCount--);
            }
            int main(void)
            {
                 GPIO_init();
                 while(1)
                 {
                     GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);//LED ON
                     Delay(0xB0000);
                     GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET);//LED OFF
                     Delay(0xB0000);
                 }
            }
            ----------------------------------------
            板子上的LED终于开始闪烁了,呵呵,这次全部都是用库,没有直接操作寄存器,库函数还是挺方便的

            1.仅仅是用到RCC和GPIO两个库的4个函数,却也是几番周折。GPIO_InitStruct这是个自定义的结构体
            ,GPIO的库里也只是在函数里面有定义,所以我们要调用的话同样须先定义这个结构体。
            2.参看ST的例程,GPIO为了减少功耗和增强EMI/EMC,都先设置成模拟输入状态。我照搬了过来GPIOA0
            设置成推挽输出,可是忘记设置IO口速度,这导致输出失败,LED一直不亮。
            3.int main(void),代码要规范,这种标准的格式要记住。还有不要忘记先声明函数。
            


            7楼2011-01-20 19:16
            回复
              8楼2011-05-27 17:04
              回复