初级会员

- 积分
- 179
- 金钱
- 179
- 注册时间
- 2016-10-2
- 在线时间
- 29 小时
|
最近在搞一个航模的项目,下位机需要用串口1接收无线信息,再把接收到的信息用串口2发出去(串口2接的舵机);通过这些天学习各位大神的资料,目前已经实现了部分目标。先说程序,我将原子哥的蓝牙程序中用不到的全部删除,再将USART2和MAIN分别改为如下:
[size=15.4545450210571px]USART2
--------------------------------------------------------------------------------------------------------------------
#include "usart2.h"
//////////////////////////////////////////////////////////////////////////////////
//èç1ûê1óÃucos,Ôò°üà¨ÏÂÃæμÄí·Îļt¼′¿é.
#if SYSTEM_SUPPORT_UCOS
#include "includes.h" //ucos ê1óÃ
#endif
#if EN_USART2_RX //èç1ûê1Äüá˽óêÕ
//′®¿ú1ÖD¶Ï·tÎñ3ìDò
//×¢òa,¶áè¡USARTx->SRÄü±üÃaÄaÃûÆäÃîμÄ′íÎó
u8 USART2_RX_BUF[USART2_REC_LEN]; //½óêÕ»o3å,×î′óUSART_REC_LEN¸ö×Ö½ú.
//½óêÕ×′ì¬
//bit15£¬ ½óêÕíê3é±êÖ¾
//bit14£¬ ½óêÕμ½0x0d
//bit13~0£¬ ½óêÕμ½μÄóDD§×Ö½úêyÄ¿
u16 USART2_RX_STA=0; //½óêÕ×′쬱ê¼Ç
void USART2_IRQHandler(void)
{
u8 res;
#ifdef OS_CRITICAL_METHOD //èç1ûOS_CRITICAL_METHOD¶¨òåáË,ËμÃ÷ê1óÃucosIIáË.
OSIntEnter();
#endif
if(USART2->SR&(1<<5))//½óêÕμ½êy¾Y
{
res=USART2->DR;
if((USART2_RX_STA&0x8000)==0)//½óêÕÎ′íê3é
{
if(USART2_RX_STA&0x4000)//½óêÕμ½áË0x0d
{
if(res!=0x0a)USART2_RX_STA=0;//½óêÕ′íÎó,ÖØD¿aê¼
else USART2_RX_STA|=0x8000; //½óêÕíê3éáË
}else //»1ûêÕμ½0X0D
{
if(res==0x0d)USART2_RX_STA|=0x4000;
else
{
USART2_RX_BUF[USART2_RX_STA&0X3FFF]=res;
USART2_RX_STA++;
if(USART2_RX_STA>(USART2_REC_LEN-1))USART2_RX_STA=0;//½óêÕêy¾Y′íÎó,ÖØD¿aê¼½óêÕ
}
}
}
}
#ifdef OS_CRITICAL_METHOD //èç1ûOS_CRITICAL_METHOD¶¨òåáË,ËμÃ÷ê1óÃucosIIáË.
OSIntExit();
#endif
}
#endif
//3õê¼»ˉIO ′®¿ú1
//pclk2 CLK2ê±ÖóÆμÂê(Mhz)
//bound:2¨ìØÂê
//CHECK OK
//091209
void USART2_Init(u32 pclk1,u32 bound)
{
float temp;
u16 mantissa;
u16 fraction;
temp=(float)(pclk1*1000000)/(bound*16);//μÃμ½USARTDIV
mantissa=temp; //μÃμ½Õûêy2¿·Ö
fraction=(temp-mantissa)*16; //μÃμ½D¡êy2¿·Ö
mantissa<<=4;
mantissa+=fraction;
RCC->APB2ENR|=1<<2; //ê1ÄüPORTA¿úê±Öó
RCC->APB1ENR|=1<<17; //ê1Äü′®¿úê±Öó
GPIOA->CRL&=0XFFFF00FF;//IO×′ì¬éèÖÃ
GPIOA->CRL|=0X00008B00;//IO×′ì¬éèÖÃ
RCC->APB1RSTR|=1<<17; //¸′λ′®¿ú1
RCC->APB1RSTR&=~(1<<17);//í£Ö1¸′λ
//2¨ìØÂêéèÖÃ
USART2->BRR=mantissa; // 2¨ìØÂêéèÖÃ
USART2->CR1|=0X200C; //1λí£Ö1,ÎTD£Ñéλ.
#if EN_USART2_RX //èç1ûê1Äüá˽óêÕ
//ê1Äü½óêÕÖD¶Ï
USART2->CR1|=1<<8; //PEÖD¶Ïê1Äü
USART2->CR1|=1<<5; //½óêÕ»o3åÇø·Ç¿ÕÖD¶Ïê1Äü
MY_NVIC_Init(2,3,USART2_IRQn,2);//×é2£¬×îμíóÅÏè¼¶
#endif
}
----------------------------------------------------------------------------------------------------------------------
MAIN
----------------------------------------------------------------------------------------------------------------------
#include "sys.h"
#include "usart.h"
#include "usart2.h"
#include "delay.h"
#include "led.h"
#include "beep.h"
#include "key.h"
int main(void)
{
u16 t;
u16 len;
u16 times=0;
Stm32_Clock_Init(9); //Ïμí3ê±ÖóéèÖÃ
delay_init(72); //Ñóê±3õê¼»ˉ
uart_init(72,115200); //′®¿ú3õê¼»ˉÎa9600
USART2_Init(36,115200); //′®¿ú13õê¼»ˉÎa9600
LED_Init(); //3õê¼»ˉóëLEDᬽóμÄó2¼t½ó¿ú
BEEP_Init(); //3õê¼»ˉ·äÃùÆ÷¶Ë¿ú
KEY_Init(); //3õê¼»ˉóë°′¼üᬽóμÄó2¼t½ó¿ú
while(1)
{
if(USART_RX_STA&0x8000)//èç1û′®1½óêÕμ½êy¾Y£»
{
len=USART_RX_STA&0x3FFF;//μÃμ½′Ë′νóêÕμ½μÄêy¾Y3¤¶è£»
for(t=0;t<len;t++)
{
USART2->DR=USART_RX_BUF[t];//½«′®¿ú1½óêÕ»o′æí¨1y′®¿ú2·¢Ëí3öè¥
while((USART2->SR&0X40)==0);//μè′y·¢Ëí½áêø
}
USART_RX_STA=0;//½óêÕ×′쬱ê¼Ç
len=0;
delay_ms(10);
}
// else(USART2_RX_STA&0x8000);//èç1û′®2½óêÕμ½êy¾Y£»
if(USART2_RX_STA&0x8000)//èç1û′®2½óêÕμ½êy¾Y£»
{
len=USART2_RX_STA&0x3FFF;//μÃμ½′Ë′νóêÕμ½μÄêy¾Y3¤¶è£»
for(t=0;t<len;t++)
{
USART1->DR=USART2_RX_BUF[t];//½«′®¿ú2½óêÕ»o′æí¨1y′®¿ú1·¢Ëí3öè¥
while((USART1->SR&0X40)==0);//μè′y·¢Ëí½áêø
}
USART2_RX_STA=0;//½óêÕ×′쬱ê¼Ç
len=0;
delay_ms(10);
}
else
{ times++;
if(times%30==0)LED0=!LED0;//éá˸LED,ìáê¾Ïμí3ÕyÔúÔËDD.
delay_ms(10);
}
}
}
再说说我的链接方式,串口1和电脑链接(就是平时下载程序的连接方式);串口2与无线模块1链接;无线模块2通过USB转串口插在另一台电脑U口;
打开两台电脑上的串口助手,设置好波特率等就可以通信了(波特率设置串口和无线模块的都要一致)
|
-
-
|