STM32F10x 学习笔记6(USART实现串口通讯 2)
时间:11-20
来源:互联网
点击:
- charfull;
- COM_RING_BUF*pbuf;
- switch(port)
- {/*Obtainpointertocommunicationschannel*/
- caseCOM1:
- pbuf=&COM1Buf;
- break;
- caseCOM2:
- pbuf=&COM2Buf;
- break;
- default:
- return(1);
- }
- OS_ENTER_CRITICAL();
- if(pbuf->RingBufTxCtr
- full=0;/*BufferisNOTfull*/
- }else{
- full=1;/*Bufferisfull*/
- }
- OS_EXIT_CRITICAL();
- return(full);
- }
- //ThisfunctioniscalledbytheRxISRtoinsertacharacterintothereceiveringbuffer.
- staticvoidCOMPutRxChar(unsignedcharport,unsignedcharc)
- {
- COM_RING_BUF*pbuf;
- switch(port)
- {/*Obtainpointertocommunicationschannel*/
- caseCOM1:
- pbuf=&COM1Buf;
- break;
- caseCOM2:
- pbuf=&COM2Buf;
- break;
- default:
- return;
- }
- if(pbuf->RingBufRxCtr
- pbuf->RingBufRxCtr++;/*No,incrementcharactercount*/
- *pbuf->RingBufRxInPtr++=c;/*Putcharacterintobuffer*/
- if(pbuf->RingBufRxInPtr==&pbuf->RingBufRx[COM_RX_BUF_SIZE]){/*WrapINpointer*/
- pbuf->RingBufRxInPtr=&pbuf->RingBufRx[0];
- }
- }
- }
- //ThisfunctioniscalledbytheTxISRtoextractthenextcharacterfromtheTxbuffer.
- //ThefunctionreturnsFALSEifthebufferisemptyafterthecharacterisextractedfrom
- //thebuffer.ThisisdonetosignaltheTxISRtodisableinterruptsbecausethisisthe
- //lastcharactertosend.
- staticunsignedcharCOMGetTxChar(unsignedcharport,unsignedchar*err)
- {
- unsignedcharc;
- COM_RING_BUF*pbuf;
- switch(port)
- {/*Obtainpointertocommunicationschannel*/
- caseCOM1:
- pbuf=&COM1Buf;
- break;
- caseCOM2:
- pbuf=&COM2Buf;
- break;
- default:
- *err=COM_BAD_CH;
- return(0);
- }
- if(pbuf->RingBufTxCtr>0){/*Seeifbufferisempty*/
- pbuf->RingBufTxCtr--;/*No,decrementcharactercount*/
- c=*pbuf->RingBufTxOutPtr++;/*Getcharacterfrombuffer*/
- if(pbuf->RingBufTxOutPtr==&pbuf->RingBufTx[COM_TX_BUF_SIZE])
- {
- pbuf->RingBufTxOutPtr=&pbuf->RingBufTx[0];/*WrapOUTpointer*/
- }
- *err=COM_NO_ERR;
- return(c);/*Charactersarestillavailable*/
- }else{
- *err=COM_TX_EMPTY;
- return(0);/*Bufferisempty*/
- }
- }
- voidUSART1_IRQHandler(void)
- {
- unsignedintdata;
- unsignedcharerr;
- if(USART1->SR&0x0F)
- {
- //Seeifwehavesomekindoferror
- //Clearinterrupt(donothingaboutit!)
- data=USART1->DR;
- }
- elseif(USART1->SR&USART_FLAG_RXNE)//ReceiveDataRegFullFlag
- {
- data=USART1->DR;
- COMPutRxChar(COM1,data);//Insertreceivedcharacterintobuffer
- }
- elseif(USART1->SR&USART_FLAG_TXE)
- {
- data=COMGetTxChar(COM1,&err);//Getnextcharactertosend.
- if(err==COM_TX_EMPTY)
- {//Dowehaveanymorecharacterstosend?
- //No,DisableTxinterrupts
- //USART_ITConfig(USART1,USART_IT_TXE|USART_IT_TC,ENABLE);
- USART1->CR1&=~USART_FLAG_TXE|USART_FLAG_TC;
- }
- else
- {
- USART1->DR=data;//Yes,Sendcharacter
- }
- }
- }
- voidUSART2_IRQHandler(void)
- {
- unsignedintdata;
- unsignedcharerr;
- if(USART2->SR&0x0F)
- {
- //Seeifwehavesomekindoferror
- //Clearinterrupt(donothingaboutit!)
- data=USART2->DR;
- }
- elseif(USART2->SR&USART_FLAG_RXNE)//ReceiveDataRegFullFlag
- {
- data=USART2->DR;
- COMPutRxChar(COM2,data);//Insertreceivedcharacterintobuffer
- }
- elseif(USART2->SR&USART_FLAG_TXE)
- {
- data=COMGetTxChar(COM2,&err);//Getnextcharactertosend.
- if(err==COM_TX_EMPTY)
- {//Dowehaveanymorecharacterstosend?
- //No,DisableTxinterrupts
- //USART_ITConfig(USART2,USART_IT_TXE|USART_IT_TC,ENABLE);
- USART2->CR1&=~USART_FLAG_TXE|USART_FLAG_TC;
- }
- else
- {
- USART2->DR=data;//Yes,Sendcharacter
- }
- }
- }
下面给个例子主程序,来演示如何使用上面的串口驱动代码。
- #include"misc.h"
- #include"stm32f10x.h"
- #include"com_buffered.h"
- voidUART_PutStrB(unsignedcharport,uint8_t*str)
- {
- while(0!=*str)
- {
- COMPutCharB(port,*str);
- str++;
- }
- }
- voidUSART1_Init(void)
- {
- GPIO_InitTypeDefGPIO_InitStructure;
- USART_InitTypeDefUSART_InitStructure;
- NVIC_InitTypeDefNVIC_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);
- /*ConfigureUSARTTxasalternatefunctionpush-pull*/
- GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
- GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
- GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
- GPIO_Init(GPIOA,&GPIO_InitStructure);
- /*ConfigureUSARTRxasinputfloating*/
- GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOA
STM32F10xUSAR串口通 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)