#include "sys.h"
#include "usart.h"
//////////////////////////////////////////////////////////////////////////////////
//如果使用ucos,則包括下面的頭文件即可.
#if SYSTEM_SUPPORT_OS
#include "includes.h" //ucos 使用
#endif
//////////////////////////////////////////////////////////////////////////////////
//本程序只供學習使用,未經作者許可,不得用于其它任何用途
//ALIENTEK STM32開發板
//串口1初始化
//正點原子@ALIENTEK
//技術論壇:www.openedv.com
//修改日期:2012/8/18
//版本:V1.5
//版權所有,盜版必究。
//Copyright(C) 廣州市星翼電子科技有限公司 2009-2019
//All rights reserved
//********************************************************************************
//V1.3修改說明
//支持適應不同頻率下的串口波特率設置.
//加入了對printf的支持
//增加了串口接收命令功能.
//修正了printf第一個字符丟失的bug
//V1.4修改說明
//1,修改串口初始化IO的bug
//2,修改了USART_RX_STA,使得串口最大接收字節數為2的14次方
//3,增加了USART_REC_LEN,用于定義串口最大允許接收的字節數(不大于2的14次方)
//4,修改了EN_USART1_RX的使能方式
//V1.5修改說明
//1,增加了對UCOSII的支持
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////
//加入以下代碼,支持printf函數,而不需要選擇use MicroLIB
#if 1
#pragma import(__use_no_semihosting)
//標準庫需要的支持函數
struct __FILE
{
int handle;
};
FILE __stdout;
//定義_sys_exit()以避免使用半主機模式
_sys_exit(int x)
{
x = x;
}
//重定義fputc函數
int fputc(int ch, FILE *f)
{
while((USART1->SR&0X40)==0);//循環發送,直到發送完畢
USART1->DR = (u8) ch;
return ch;
}
#endif
#if EN_USART1_RX //如果使能了接收
//串口1中斷服務程序
//注意,讀取USARTx->SR能避免莫名其妙的錯誤
u8 USART_RX_BUF[USART_REC_LEN]; //接收緩沖,最大USART_REC_LEN個字節.
//接收狀態
//bit15, 接收完成標志
//bit14, 接收到0x0d
//bit13~0, 接收到的有效字節數目
u16 USART_RX_STA=0; //接收狀態標記
void uart_init(u32 bound){
//GPIO端口設置
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //使能USART1,GPIOA時鐘
//USART1_TX GPIOA.9
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復用推挽輸出
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9
//USART1_RX GPIOA.10初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空輸入
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10
//Usart1 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//搶占優先級3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子優先級3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根據指定的參數初始化VIC寄存器
//USART 初始化設置
USART_InitStructure.USART_BaudRate = bound;//串口波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字長為8位數據格式
USART_InitStructure.USART_StopBits = USART_StopBits_1;//一個停止位
USART_InitStructure.USART_Parity = USART_Parity_No;//無奇偶校驗位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//無硬件數據流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收發模式
USART_Init(USART1, &USART_InitStructure); //初始化串口1
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//開啟串口接受中斷
USART_Cmd(USART1, ENABLE); //使能串口1
}
void USART1_IRQHandler(void) //串口1中斷服務程序
{
u8 Res;
#if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS為真,則需要支持OS.
OSIntEnter();
#endif
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中斷(接收到的數據必須是0x0d 0x0a結尾)
{
Res =USART_ReceiveData(USART1); //讀取接收到的數據
if((USART_RX_STA&0x8000)==0)//接收未完成
{
if(USART_RX_STA&0x4000)//接收到了0x0d
{
if(Res!=0x0a)USART_RX_STA=0;//接收錯誤,重新開始
else USART_RX_STA|=0x8000; //接收完成了 把1000 0000 0000 0000
}
else //還沒收到0X0D
{
if(Res==0x0d)USART_RX_STA|=0x4000;//把15位值一 0100 0000 0000 0000
else
{
USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
USART_RX_STA++;
if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收數據錯誤,重新開始接收
}
}
}
}
#if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS為真,則需要支持OS.
OSIntExit();
#endif
}
#endif
/*void USART1_IRQHandler(void) //串口1中斷服務程序
{
u8 Res;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中斷(接收到的數據必須是0x0d 0x0a結尾)
{
Res =USART_ReceiveData(USART1);//(USART2->DR); //讀取接收到的數據
if((USART_RX_STA&0x8000)==0)//接收未完成
if(USART_RX_STA&0x4000)//接收到了0x0d
{
if(Res!=0x0a)
{
USART_RX_STA&=0x3FFF; //如果沒接收到0x0a,清除接收到0d標志位。繼續接收數據
USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
USART_RX_STA++;
}
else USART_RX_STA|=0x8000; //接收完成了
}
else //還沒收到0X0D
{
if(Res==0x0d)
{
USART_RX_STA|=0x4000;
USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
USART_RX_STA++;
}
else
{
USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
USART_RX_STA++;
if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收數據錯誤,重新開始接收
}
}
}
}
*/
首先進行GPIOA設USART1使能,都在APB2總線上
TX設置成 復用推挽輸出GPIO_Mode_AF_PP,RX設置GPIO_Mode_IN_FLOATING浮空輸入
中斷優先級配置
串口結構體賦值
中斷服務函數 原子程序會出現,接收到0x0d如何后面不是0x0a的話,會把前面接收數據清除,這是一個BUG。
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
//ALIENTEK Mini STM32開發板范例代碼3
//串口實驗
//技術支持:www.openedv.com
//廣州市星翼電子科技有限公司
int main(void)
{
u8 t;
u8 len;
u16 times=0;
delay_init(); //延時函數初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 設置中斷優先級分組2
uart_init(9600); //串口初始化為9600
LED_Init(); //初始化與LED連接的硬件接口
while(1)
{
if(USART_RX_STA&0x8000)
{
len=USART_RX_STA&0x3fff;//得到此次接收到的數據長度
printf("\r\n您發送的消息為:\r\n");
for(t=0;t { USART1->DR=USART_RX_BUF[t]; while((USART1->SR&0X40)==0);//等待發送結束 } printf("\r\n\r\n");//插入換行 USART_RX_STA=0; }else { times++; if(times%5000==0) { printf("\r\nALIENTEK MiniSTM32開發板 串口實驗\r\n"); printf("正點原子@ALIENTEK\r\n\r\n\r\n"); } if(times%200==0)printf("請輸入數據,以回車鍵結束\r\n"); if(times%30==0)LED0=!LED0;//閃爍LED,提示系統正在運行. delay_ms(10); } } } //bit15, 接收完成標志 //bit14, 接收到0x0d //bit13~0, 接收到的有效字節數目 u16 USART_RX_STA=0; //接收狀態標記 01xx xxxx xxxx xxxx 表示接收到0x0d 11xx xxxx xxxx xxxx 表示接收數據結束
上一篇:stm32學習筆記(四)外部中斷
下一篇:stm32學習筆記(二)按鍵實驗
推薦閱讀
史海拾趣
HALO Electronics公司的發展故事
故事一:初創與早期技術突破
HALO Electronics,全稱HALO Electronics, Inc.,成立于1991年9月19日,總部位于美國德克薩斯州。公司自成立之初便專注于通信和功率磁性元件的設計與制造。在成立的早期,HALO便展現出了強大的技術創新能力。1993年,HALO推出了TnT?模塊,這是首個具有成本效益的10base2模塊,專為房地產敏感的薄網和背板應用設計,這一產品迅速在市場上獲得了認可。緊接著,1994年,HALO又開發了一種專利的SMD變壓器技術,為行業提供了更為強大的變壓器解決方案,進一步鞏固了其在磁性元件領域的地位。
故事二:與行業領先企業的合作
HALO Electronics的發展離不開與行業內領先企業的緊密合作。1995年,HALO與Maxim Integrated Products合作,共同開發了TGM-P3系列低成本PCMCIA變壓器,這些變壓器專為MAX253/845系列單片振蕩器/功率驅動器設計,用于小型低成本DC/DC轉換器。這一合作不僅提升了HALO產品的市場競爭力,也為其在高端應用領域的拓展奠定了堅實基礎。
故事三:創新產品的持續推出
HALO Electronics一直致力于創新產品的研發與推出。1997年,公司推出了Quatra?系列首個四端口T1/E1磁性模塊,這一產品是與Level One(Intel)共同開發的,提供了更高密度的T1/E1解決方案。隨后,在1998年,HALO又創造了Ultra?系列變壓器,這是當時最具成本效益和房地產效率的10/100base-TX變壓器,其SOIC16封裝成為了單端口快速以太網應用的行業標準。這些創新產品的推出,不斷推動著HALO在電子行業的領先地位。
故事四:安全與效率并重的產品開發
HALO Electronics在產品開發過程中始終注重安全與效率。1999年,公司宣布了業界首個UL認可的4.5KV隔離變壓器系列,這些變壓器專為需要高度安全的以太網應用設計,滿足了市場對高安全性產品的迫切需求。同年,HALO還推出了業界較小的雙端口T1/E1變壓器系列,進一步提升了產品的空間利用率和效率。這些舉措不僅彰顯了HALO在產品安全與效率方面的卓越追求,也為其贏得了更多客戶的信賴和支持。
故事五:全球化布局與市場份額的擴大
隨著業務的不斷發展,HALO Electronics逐漸開始了全球化布局。公司在全球范圍內建立了多個銷售辦事處和倉庫,包括加州圣克拉拉、內華達州拉斯維加斯、香港和新加坡等地。同時,HALO還在北美、歐洲和亞洲的主要地區設立了衛星辦公室,由區域經理負責開展工作。此外,HALO還在全球范圍內擁有眾多制造商代表和分銷商,形成了完善的銷售和服務網絡。這些舉措不僅提升了HALO的市場覆蓋率和服務能力,也為其在全球范圍內的市場份額擴大奠定了堅實基礎。如今,HALO已成為電子行業中備受矚目的磁性元件供應商之一。
隨著技術的不斷進步,Bel Power Solutions始終保持著對創新的熱情。公司不斷加大研發投入,積極引進先進技術和人才,推動產品的升級換代。其中,一項重要的技術突破是公司成功研發出具有高效能、高可靠性特點的電源轉換技術。這一技術的推出,不僅提升了公司產品的競爭力,還為客戶提供了更加優質、可靠的電源解決方案。同時,公司還根據市場需求,推出了多款定制化、個性化的電源產品,滿足了不同客戶的特殊需求。
金溢科技是國內ETC行業的領軍企業之一。公司自創立之初,就致力于ETC技術的研發與應用。通過不斷的技術創新,金溢科技成功推出了多款具有自主知識產權的ETC設備,并在市場中獲得了廣泛應用。同時,公司還積極參與國家標準的制定和修訂工作,推動ETC行業的規范化發展。金溢科技憑借其在ETC領域的卓越表現,逐漸成為了行業的標桿企業。
隨著航空技術的不斷發展,B&F公司開始積極探索與其他行業的跨界合作。例如,公司與一家知名電子公司合作,共同研發了一款新型飛行控制系統。這款系統采用了最先進的電子技術和算法,大大提高了飛機的操控性能和飛行效率。通過這種跨界合作,B&F公司不僅拓展了業務領域,還為公司帶來了更多的發展機遇。
隨著技術產品的成功推出,Horizon開始積極拓展市場。公司首先在國內市場建立了完善的銷售和服務網絡,通過參加行業展會、舉辦技術研討會等方式提升品牌知名度。同時,Horizon也意識到國際市場的巨大潛力,逐步在海外設立分支機構,將產品推向全球市場。通過持續的市場推廣和優質的客戶服務,Horizon的品牌影響力逐漸增強,成為電子行業內備受矚目的新興企業。
隨著智能手機市場的迅猛發展,CMS看到了新的機遇。公司投入大量研發資源,成功開發出一款專為智能手機設計的超低功耗芯片。這款芯片不僅性能卓越,而且能夠有效延長手機的續航時間。CMS通過與多家知名手機廠商合作,將這款芯片廣泛應用于各類智能手機中,從而迅速打開了市場。
傳統的多機通訊系統一般需要四條線完成: 1.電源線;2.地線;3.發送信號線;4.接收信號線。然而,對于主機和分機距離較遠、分機臺數較多的系統,采用四線制的經費投入較大,安裝起來也頗困難。基于這一問題,本文結合為某醫院研制的既有模擬信號( ...… 查看全部問答∨ |
|
問一個在ADS編譯器下關于結構體對齊的問題. 如下結構體: typedef struct { U8 bLength; U8 bDescriptorType; #pragma pack(paush,1 &nbs ...… 查看全部問答∨ |
|
ATMEL年初總算放出了一系列帶源碼的WINCE BSP了,但是我在使用AT9261的CE5帶源碼1.7版本的BSP時,在編譯的過程中總是報如下錯誤: BUILD: [01:0000000100:INFO ] Directory: D:\\WINCE500\\PLATFORM\\AT91SAM9261EK\\SRC\\MISC\\GPIO ...… 查看全部問答∨ |
把板子上的地線和JLINK的地線連接起來時,485通信正常。 不接時,stm32只有接收沒有發送信號。 這是什么原因呢。用的是MAX3485。難道是485通信電路不對嗎。 附件中有電路圖,請指點。 最小系統.pdf (45.67 KB) 下載次 ...… 查看全部問答∨ |
關于WinCE6.0系統上新建窗口不執行OnCreate函數的問題 大家好,我們使用的開發板是CHSINT SDK For WinCE 6.0 (ARMV4I),系統是WinCE6.0,開發環境VS2005。我新建了一個基于對話框的MFC程序,需要在創建窗口的時候一些初始化,為xxxDlg類添加了WM_CREATE消息響應函數,并加了初始化代碼,但是調試的時候 ...… 查看全部問答∨ |
本帖最后由 oliverzhang 于 2014-3-19 14:13 編輯 對于熱衷DIY的用戶而言,RaspberryPi開發板顯然已經成為最熱門的開發設備了,只要用戶想得到的工程,Raspberry Pi幾乎都能幫你實現。Raspberry Pi雖然具有音頻功能, ...… 查看全部問答∨ |
設計資源 培訓 開發板 精華推薦
- micropython延時定時 - sleep教程pyboard教程
- 【NXP Rapid IoT評測】+第一個在線工程
- EEWORLD大學堂----Digi-Key 自習室 - 電子元器件選型小技巧
- 2014紀念貼,,明天2015了
- 【平頭哥Sipeed LicheeRV 86 Panel測評】- 1、Lichee RV 86 Panel首次上電
- BU72435熱賣
- 分享MSP430F4xxx小RAM堆棧溢出
- 直接用51驅動MMA7455會燒MMA7455嗎?
- lattice diamond中port被識別成unconnected,該如何解決呢?
- 快來看哪!TI工程師又有小貼士了! 47:解決隔離式開關的傳導性共模輻射問題