基礎
CT117E開発ボードは2つのシリアルポートにつながっていますが、シリアルポート1は通常使用されない9ピンポートに接続されているため、シリアルポート2の回路のみを使用します。
シリアルポートの構成手順:
- シリアルポートクロックイネーブル、GPIOクロックイネーブル
- シリアルポートのリセット
- GPIOの初期化
- シリアルポートパラメータの初期化
- シリアルポート割り込みをオンにして、割り込みを初期化します
- シリアルポートを有効にする
- データを受信するシリアルポートのシリアルポート割り込みサービス機能を書き込む
- シリアルデータ送信機能
コード:
void usart2_init()
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);//PA2为发送引脚
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;//PA3为接收引脚
GPIO_Init(GPIOA,&GPIO_InitStructure);
USART_InitStructure.USART_BaudRate=9600;//波特率
USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//不适用硬件流控制
USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;//发送和接受模式
USART_InitStructure.USART_WordLength=USART_WordLength_8b;//8位数据为
USART_InitStructure.USART_StopBits=USART_StopBits_1;//1位停止位
USART_InitStructure.USART_Parity=USART_Parity_No;//不进行奇偶校验
USART_Init(USART2,&USART_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel=USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
NVIC_Init(&NVIC_InitStructure);
USART_Cmd(USART2,ENABLE);
USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);//串口接收中断
}
シリアルポート送信機能は自分で作成する必要があります。各シリアルポート送信後は、送信が完了するまで待ってから次回送信する必要があります。コードの実施形態は、送信まで待つことです。送信する前にバッファが空です。
void USART2_SendString(u8 *str)//中断标志状态和一般状态是不一样的。
{
u8 index = 0;
do
{
USART_SendData(USART2,str[index]); //发送数据
while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == 0); //发送缓冲区为空就是发送完成 //USART_FLAG_TC 表示传输完毕;USART_FLAG_TXE表示发送缓冲区空
index++;
}while(str[index] != 0);
}
シリアルポートの受信は、割り込み機能に配置されます。
u8 RXbuf[20];//初始化就是0
u8 RXover=0;
u8 RXcont=0;
void USART2_IRQHandler(void)
{
u8 temp;
if(USART_GetITStatus(USART2,USART_IT_RXNE) == SET)//接收到中断
{
USART_ClearITPendingBit(USART2,USART_IT_RXNE);
temp = USART_ReceiveData(USART2);
if(temp == '\n')
{
RXcont = 0;
RXover = 1;//接收到的标志
USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);//先把串口给关掉,处理接收到的数据,等需要的时候再打开。。
}else
{
RXbuf[RXcont] = temp;
RXcont++;
}
}
}
main関数での構成:
if(RXover)
{
USART2_SendString(RXbuf);
LCD_ClearLine(Line3);
LCD_DisplayStringLine(Line3,RXbuf);
for(i=0;i<20;i++)
{
RXbuf[i]=0;
}
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
RXover=0;
}