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 |
|
【1樓】 sunsky 積分:176 派別: 等級(jí):------ 來(lái)自:
|
非常精彩。 |
|
2009-06-11,12:23:11 |
|
【2樓】 lollipop 天堂里沒(méi)有豬頭豬腦
 積分:604 派別: 等級(jí):------ 來(lái)自:上海
|
有意思 |
|
2009-06-11,12:57:30 |
|
【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 |
|
【4樓】 zx5111030 積分:178 派別: 等級(jí):------ 來(lái)自:北京
|
mark |
|
2009-06-11,16:47:51 |
|
【5樓】 lihq97 積分:47 派別: 等級(jí):------ 來(lái)自:廣東江門(mén)市新會(huì)區(qū)
|
很精彩,對(duì)我們新手很有幫助! |
|
2009-06-14,09:17:54 |
|
【6樓】 qfmcu 清風(fēng)徐徐
 積分:216 派別: 等級(jí):------ 來(lái)自:濟(jì)南
|
非常精彩,有續(xù)集否? |
|