日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

stm32調(diào)試記 (www.ourdev.cn)

 葡萄干 2010-05-26
stm32調(diào)試記 回復(fù)數(shù):52,點(diǎn)擊數(shù):5934
【樓主位】 sanhope
積分:42
派別:
等級(jí):------
來(lái)自:
第一節(jié): 陌生的她和大叔
       人近中年,不知不覺(jué)竟然成為孩子的父親,不知不覺(jué)竟然成為別人的大叔,心中很是彷徨,我已不再年少。前些日子學(xué)習(xí)stm8,一口氣工作近2個(gè)星期,當(dāng)時(shí)精神飽滿,心中很是得意,原來(lái)我也可以年輕。誰(shuí)知放假去了次青島和家人度假回來(lái)后竟然感冒了一個(gè)星期,哎,我還是老了。
       寫(xiě)完stm8調(diào)試記后,就想踐踏一下stm32,就像大叔和美女。。。因?yàn)橹挥忻琅拍茏尨笫逵X(jué)得年輕,只有美女才能讓大叔精力旺盛,stm32是我的美女嗎?我不知道,我要接近她,我要駕馭她。
     KEIL 的大名人盡皆知,51年代就大放異彩。說(shuō)到這兒,不得不說(shuō)一下那些為電子公益事業(yè)做出貢獻(xiàn)的先行者們。甚是懷念那個(gè)年代,丁丁,老萬(wàn),所長(zhǎng),午夜聽(tīng)風(fēng),龍嘯九天等諸多大蝦。他們推廣keil,他們無(wú)私的奉獻(xiàn),就像現(xiàn)在的老key一樣,知無(wú)不言,言無(wú)不盡。
     我使用的環(huán)境: keil mdk 350
                    
                    St 的 三合一板
     
板子雖小,還是可以做很多事情的,白菜老弟做的板子據(jù)說(shuō)很強(qiáng)勢(shì),已經(jīng)預(yù)定,現(xiàn)在先解下渴,玩玩只有一個(gè)STM32F103C8T6的小家碧玉。
Mdk350集成了st的st link,所以只要在OPTION FOR TARGET 的 DEBUG 和UTILITIES下選擇st link debug就可以正確連接。庫(kù)使用的是v2.01

我要讓她跑起來(lái),我需要做什么?

我要有一個(gè)時(shí)鐘,目標(biāo)是48mhz,這是為了以后調(diào)試usb

STM32的時(shí)鐘和STM8的時(shí)鐘基本上是一樣的。她內(nèi)部有個(gè)8mhz的振蕩器,不過(guò)我不打算用它。三合一板外部焊接了一個(gè)8mhz的晶振我要用她做時(shí)鐘源。
時(shí)鐘初始化: 

      RCC_DeInit();  //恢復(fù)默認(rèn)值這沒(méi)什么用,不寫(xiě)他也不影響運(yùn)行

  RCC_HSEConfig(RCC_HSE_ON ); //啟動(dòng)外部時(shí)鐘

  while(!RCC_GetFlagStatus(RCC_FLAG_HSERDY));//等待外部時(shí)鐘穩(wěn)定

  FLASH_SetLatency(FLASH_Latency_1); //48mhz運(yùn)行時(shí),flash要加一個(gè)等待周期
       其實(shí)剛開(kāi)始時(shí)我沒(méi)有加這個(gè)延時(shí),也沒(méi)有什么不良的反應(yīng),不知道時(shí)間長(zhǎng)了會(huì)不會(huì)有問(wèn)題

  FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//預(yù)緩沖使能

  RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_6);//pll輸出是外部時(shí)鐘的6倍

  RCC_PLLCmd(ENABLE); //使能pll

  while(!RCC_GetFlagStatus(RCC_FLAG_PLLRDY));//等待pll穩(wěn)定

  RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//切換到PLL時(shí)鐘

  while(RCC_GetSYSCLKSource()!=0x8);//等待系統(tǒng)時(shí)鐘穩(wěn)定
      
             RCC_PCLK1Config(RCC_HCLK_Div2);//低速時(shí)鐘為24mhz

  RCC_PCLK2Config(RCC_HCLK_Div1);//高速時(shí)鐘為48mhz

經(jīng)過(guò)上面的設(shè)置,時(shí)鐘正是工作,我們可以通過(guò)這個(gè)函數(shù)RCC_GetClocksFreq();
來(lái)驗(yàn)證
      RCC_ClocksTypeDef  RCC_Clocks_T;
      RCC_GetClocksFreq( &RCC_Clocks_T);
RCC_Clocks_T中反應(yīng)了sys clk,  HCLK  PCLK1,PCLK2, ADC CLK的頻率。

時(shí)鐘有了,我們還要干點(diǎn)什么?板上有她唯一的外設(shè),led小燈。我要讓處于pb5的led亮。
     //首先開(kāi)啟PB口的時(shí)鐘,pb口在高速apb2上
  RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB,ENABLE );
 下面要進(jìn)行pb口的初始化

          GPIO_InitTypeDef  GPIOB_STR;   //定義一個(gè)結(jié)構(gòu)變量用于初始化
     
GPIOB_STR.GPIO_Pin = GPIO_Pin_5;  //選擇pb5

    GPIOB_STR.GPIO_Speed = GPIO_Speed_10MHz; //最大10mhz輸出

    GPIOB_STR.GPIO_Mode  = GPIO_Mode_Out_PP;//推挽輸出

    GPIO_Init( GPIOB,&GPIOB_STR);  //配置pb5     
Pb5已經(jīng)配置好了,下面我要點(diǎn)亮led,pb5要輸出1
        GPIO_SetBits( GPIOB,GPIO_Pin_5);
相反熄滅她如下:
        GPIO_ResetBits( GPIOB,GPIO_Pin_5);
 
這一節(jié)就到這,意法的庫(kù)真是好東西,stm8調(diào)試的時(shí)候沒(méi)有使用是因?yàn)閷?shí)在不愿看那么多的代碼。現(xiàn)在學(xué)習(xí)stm32,順便把她的庫(kù)看了看,覺(jué)得雖然龐大瑣碎,但結(jié)構(gòu)很優(yōu)美,便用了起來(lái)。不過(guò)我怕用習(xí)慣了,把我自己用傻了,以后換別的cpu時(shí),不會(huì)用了。

第二節(jié) 定時(shí),中斷,和意法的風(fēng)騷
     
         玩cpu嗎當(dāng)然等玩定時(shí)器,重要性在stm8一文中已有描述,這里不再多說(shuō)。
     我要使用tim2實(shí)現(xiàn)1s定時(shí),這有些長(zhǎng)不夠?qū)嵱?,但是我只是玩玩?
     
     第一步要配置時(shí)鐘
            RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2|RCC_APB1Periph_SPI2,ENABLE);

      Tim2處于時(shí)鐘樹(shù)的apb1上。
      下面是初始化代碼
         TIM2->PSC |=24000; //設(shè)置預(yù)分頻,實(shí)現(xiàn)1ms

   TIM2->ARR = 1000;  //1s產(chǎn)生一次中斷

   TIM2->DIER |=0X1;  //允許tim2更新中斷

   NVIC->ISER[0] |= (u32)(1<<TIM2_IRQChannel); //開(kāi)tim2中斷

   TIM2->CR1 |=0X1;//啟動(dòng)tim2
      說(shuō)到這,不能不說(shuō)意法的風(fēng)騷,剛開(kāi)始時(shí)翻遍手冊(cè)也沒(méi)看到nvic部分的說(shuō)明,所以第一版本的tim2初始化沒(méi)有nvic部分,以至不能進(jìn)tim2的更新中斷,后查閱阿莫的論壇才知有c_m3權(quán)威指南一物,實(shí)在讓人無(wú)語(yǔ)。這是意法的風(fēng)騷,這是新手的災(zāi)難。
         每次新建工程時(shí),keil會(huì)自動(dòng)生成一個(gè)文件stm32f10x.s,在里面有中斷向量表的描述。將相應(yīng)的中斷函數(shù)名實(shí)例化,就能實(shí)現(xiàn)中斷入口。
      我的tim2中斷函數(shù)
void TIM2_IRQHandler(void)//這個(gè)函數(shù)名能在stm32f10x.s中找到
{
   static u8 flag;
   if( flag )
   {
   
       GPIO_SetBits( GPIOB,GPIO_Pin_5); //下面能實(shí)現(xiàn)上文說(shuō)的led以0.5hz閃爍

     flag = FALSE;

   }
   else
   {
   
       GPIO_ResetBits( GPIOB,GPIO_Pin_5); 

   flag = TRUE;
   
   }

       
   TIM2->SR &=0XFFFE;  //清楚更新標(biāo)志

}

上面沒(méi)有用庫(kù)函數(shù),是因?yàn)槲蚁胱约旱念^腦里脈絡(luò)更清楚,更復(fù)合我自己的風(fēng)格。其實(shí)用庫(kù)會(huì)簡(jiǎn)單

第三節(jié) SPI和懶懶的我
       調(diào)試stm8時(shí)沒(méi)有調(diào)spi實(shí)在是因?yàn)闆](méi)有接口,在加上我這人懶散最終沒(méi)有調(diào)它,如果是美女,我就不會(huì)這么客氣了吧。
       最近身體欠佳,總感覺(jué)力不從心。又覺(jué)得時(shí)間匆匆,再不加把力氣真要荒廢此生,便生出無(wú)奈。
      閑話少說(shuō),說(shuō)說(shuō)spi吧。三合一板只有一個(gè)cpu,但它卻有兩個(gè)spi,我用飛線將他們互聯(lián),便形成了一個(gè)完整的spi通訊接口。
Spi2處于時(shí)鐘樹(shù)的apb1,spi1處于時(shí)鐘樹(shù)的apb2,時(shí)鐘部分已將apb1配置為24mhz
Apb2為48mhz
首先開(kāi)啟spi2和spi1時(shí)鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2\
                  |RCC_APB1Periph_SPI2,  \\這個(gè)是spi2的選項(xiàng)
                  ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB\
                                   |RCC_APB2Periph_SPI1\ //這個(gè)是spi1的選項(xiàng)
                                  |RCC_APB2Periph_GPIOA\
                              
  |RCC_APB2Periph_USART1,ENABLE                          

 );
下面是spi的初始化
       u32 x; 
   
   u8 y;      

   SPI_InitTypeDef SPI_X;

   SPI_X.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //全雙工

   SPI_X.SPI_Mode = SPI_Mode_Slave;//式

   SPI_X.SPI_DataSize = SPI_DataSize_8b;//

   SPI_X.SPI_CPOL = SPI_CPOL_High;//時(shí)鐘空閑是為高

   SPI_X.SPI_CPHA = SPI_CPHA_2Edge;//

   SPI_X.SPI_NSS  = SPI_NSS_Soft;//軟件控制

   SPI_X.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;

             SPI_X.SPI_FirstBit = SPI_FirstBit_MSB;

   SPI_Init(SPI2,&SPI_X);


               SPI2->CR2 |= (1<<SPI_FLAG_RXENIE)|(1<<SPI_FLAG_TXENIE);//接受和發(fā)送 中斷



   NVIC->ISER[1] |= 0X10;//開(kāi)spi2中斷

   SPI_X.SPI_Mode = SPI_Mode_Master;

   SPI_Init(SPI1,&SPI_X); //spi1為主

   SPI1->CR2 |= (1<<SPI_FLAG_RXENIE)|(1<<SPI_FLAG_TXENIE);

   NVIC->ISER[1] |= 0X8;

   SPI_Cmd(SPI2,ENABLE);

   SPI_Cmd(SPI1,ENABLE);//使能spi1和spi2

   SPI2->DR = 0Xaa;//發(fā)送數(shù)據(jù)

中斷處理函數(shù)
void SPI1_IRQHandler( void )
{
      u16 x;
  if( SPI1->SR &0X1)
  
  {
     
 x = SPI1->DR;




   }
   

  if( SPI1->SR&0x2 ) 
  {
      
  SPI1->DR =++test_data1;


  }

}

void SPI2_IRQHandler( void )
{
      vu16 x;
  if( SPI2->SR &0X1)
  
  {
     
 x = SPI2->DR;


 if( sam_data < SIZE_BUF )
 {

    sam_data1[ sam_data++ ] =x;

 }
 else
 {
     sam_data = 0;
 
 }
   }
   

  if( SPI2->SR&0x2 ) 
  {
      SPI2->DR =++test_data;
/*   if(test_data1!=0)
  {
  
      test_data1 --;
  
  }
  else
  {
  
      test_data1 =10;
  
  }  */
  }

}

外設(shè)使用的時(shí)候一定要先配置好io的使用模式。我就因?yàn)闆](méi)有配置而吃了大虧。剛開(kāi)始時(shí)收發(fā)怎么也不正常,后設(shè)置了io的方式才能工作。這大概是對(duì)新的事物還不熟悉。
Io的模式無(wú)非是,出的數(shù)據(jù)流設(shè)成輸出,入的數(shù)據(jù)流設(shè)成輸入,什么可說(shuō)。

   關(guān)于spi的代碼,不是好的風(fēng)格,其中庫(kù)夾雜著自己的方法,如果在嚴(yán)格的風(fēng)格上這不叫方法,叫發(fā)瘋。
   
第四節(jié):串口和新鳳霞
     最近聽(tīng)新鳳霞的花為媒,讓我有繞梁三日的感覺(jué)。喜歡的朋友可以聽(tīng)一下。老藝術(shù)家的東西越來(lái)越少了。時(shí)代在進(jìn)步,我們?cè)诜艞?。但放棄的都是?yōu)良的傳統(tǒng),如清廉,孝道,公正。
     我手里有兩個(gè)自己做的ch341轉(zhuǎn)串口線纜,將小板的pa9(u1_TX,設(shè)置成推挽輸出),和pa10(U1_RX,上拉輸入)
和ch341相連,就完成了硬件配置。
     我要實(shí)現(xiàn)的功能,當(dāng)cpu收到計(jì)算機(jī)發(fā)來(lái)的0XAA時(shí),發(fā)送8個(gè)0X55,在上電時(shí)cpu主動(dòng)發(fā)送一次8個(gè)0X55.

     首先配置時(shí)鐘,
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB\
                                     |RCC_APB2Periph_SPI1\ //這個(gè)是spi1的選項(xiàng)
                                     |RCC_APB2Periph_GPIOA\
                              
|RCC_APB2Periph_USART1,ENABLE  //這個(gè)是串口項(xiàng)               

 );
下面是初始化:
        USART_InitTypeDef uart_x;

NVIC_InitTypeDef nvic_x;

USART_Cmd(USART1,ENABLE); //使能串口

uart_x.USART_BaudRate = 19200;//19200, 8, n ,1

uart_x.USART_WordLength = USART_WordLength_8b;

uart_x.USART_StopBits = USART_StopBits_1;

uart_x.USART_Parity = USART_Parity_No;

uart_x.USART_Mode = USART_Mode_Rx |USART_Mode_Tx;//發(fā)送和接受

uart_x.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

USART_Init(USART1,&uart_x);

USART_ITConfig(USART1,USART_IT_TC,ENABLE);//使能發(fā)送完成中斷

USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//使能接受滿中斷

nvic_x.NVIC_IRQChannel = USART1_IRQChannel;//nvic的庫(kù)開(kāi)啟方法

nvic_x.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&nvic_x);

中斷函數(shù)
void USART1_IRQHandler( void )
{
  vu16 x;
  
  vu16 y ;

  y = USART1->SR;//讀狀態(tài)
 if(y & 0X20)//如果是非空中斷
 {
 
   x = USART1->DR&(u16)0xff;
         
// USART_SendData(USART1,0X55);

if( x == 0xaa )
{
   
   lentch_x = 0;

   USART1->CR1 |=(u16)0X8;//啟動(dòng)一次發(fā)送

}

 }
 
 if(y & 0X40)//發(fā)送完成中斷
 {

 
if(lentch_x < 8 )
{

    USART1->DR = 0X55;

lentch_x++;

}
else
{
   
 USART1->CR1 &=(u16)0XFFF7;; //清楚標(biāo)志



}

 }

}

這次完全使用了庫(kù),哈。過(guò)兩天使用dma試試,接下來(lái)還有adc等沒(méi)有測(cè)試,可板子太小了可發(fā)揮的余地不多,就剩usb了,可是它太不好肯,得好好的準(zhǔn)備準(zhǔn)備,過(guò)陣子白菜的板子到了在研究。





 
2009-06-11,11:24:57
資料 郵件 回復(fù) 引用回復(fù) 編輯 刪除
【1樓】 sunsky
積分:176
派別:
等級(jí):------
來(lái)自:
非常精彩。
 
2009-06-11,12:23:11
資料 郵件 回復(fù) 引用回復(fù) 編輯 刪除
【2樓】 lollipop 天堂里沒(méi)有豬頭豬腦

積分:604
派別:
等級(jí):------
來(lái)自:上海
有意思
 
2009-06-11,12:57:30
資料 郵件 回復(fù) 引用回復(fù) 編輯 刪除
【3樓】 kakaarm
積分:144
派別:
等級(jí):------
來(lái)自:ARM新品:路虎LPC1768開(kāi)發(fā)板(Cortex-M3),板載USB仿真器!JLINK On Board
大叔大有文采啦,你不搞文學(xué)那是文學(xué)界的一大損失啊呵呵
 
2009-06-11,15:14:52
資料 郵件 回復(fù) 引用回復(fù) 編輯 刪除
【4樓】 zx5111030
積分:178
派別:
等級(jí):------
來(lái)自:北京
mark
 
2009-06-11,16:47:51
資料 郵件 回復(fù) 引用回復(fù) 編輯 刪除
【5樓】 lihq97
積分:47
派別:
等級(jí):------
來(lái)自:廣東江門(mén)市新會(huì)區(qū)
很精彩,對(duì)我們新手很有幫助!
 
2009-06-14,09:17:54
資料 郵件 回復(fù) 引用回復(fù) 編輯 刪除
【6樓】 qfmcu 清風(fēng)徐徐

積分:216
派別:
等級(jí):------
來(lái)自:濟(jì)南
非常精彩,有續(xù)集否?

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多