#include "timer.h"
#include "usart.h"
extern ptl_stack tx_stack;
extern ptr_stack rx_stack;
int main(void)
{
SystemInit(); //初始化系统,使得系统频率为72M
systick_init(); //配置Systick,使得1ms产生中断
usart_config(); //配置usart
tx_stack_init(); //初始化发送缓冲区
rx_stack_init(); //初始化接收缓冲区
delay_ms(10);
/*待传输数据*/
tx_stack.data[0] = 0xFF;
tx_stack.data[1] = 0xFF;
tx_stack.data[2] = 0xFE;
tx_stack.data[3] = 0x09;
tx_stack.data[4] = 0x83;
tx_stack.data[5] = 0x1E;
tx_stack.data[6] = 0x04;
tx_stack.data[7] = 0x00;
tx_stack.data[8] = 0x10;
tx_stack.data[9] = 0x00;
tx_stack.data[10] = 0x50;
tx_stack.data[11] = 0xF3; //检验码
send_ptl(); //传输
delay_ms(100000);
}
/**********
上面为main.c,下面为usart.c
************/
#include "usart.h"
ptl_stack tx_stack;
ptr_stack rx_stack;
void send_ptl(void)
{
u8 i;
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
for(i = 0; i <= 11; i++)
{
USART_SendData(USART1, tx_stack.data[i]);
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
}
}
void tx_stack_init(void)
{
u8 i;
for(i = 0; i <=11; i++)
{
tx_stack.data[i] = 0x00;
}
usart_config();
}
void rx_stack_init(void)
{
u8 i;
for(i = 0; i <=11; i++)
{
rx_stack.data[i] = 0;
}
usart_config();
}
void usart_config(void)
{
/*1、打开GPIO,AFIO,USART1的时钟*/
RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1 |RCC_APB2Periph_GPIOA \
| RCC_APB2Periph_AFIO, ENABLE);
/*2\初始化相应的串口引脚*/
usart_release_gpio_init();
/*3、配置串口中断*/
usart_nvic_config();
/*4、配置串口模式*/
usart_para_config();
}
void usart_release_gpio_init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
/*配置PA9为复用推挽输出*/
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
/*配置PA10为浮空输入*/
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
}
void usart_para_config(void)
{
USART_InitTypeDef USART_InitStruct;
USART_InitStruct.USART_BaudRate = 117647; //舵机波特率设为117647;
USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStruct.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
USART_InitStruct.USART_WordLength = USART_WordLength_8b; //8
USART_InitStruct.USART_Parity = USART_Parity_No; //n
USART_InitStruct.USART_StopBits = USART_StopBits_1; //1
USART_Init(USART1, &USART_InitStruct);
USART_ClearFlag(USART1,USART_FLAG_TC); //清除发送完成标志位
USART_Cmd(USART1, ENABLE); //使能串口 1
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
}
void usart_nvic_config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //设置串口 1 中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //子优先级为 0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能
NVIC_Init(&NVIC_InitStructure);
}
int fputc(int ch, FILE*f)
{
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET)
{
}
USART_SendData(USART1,(uint8_t) ch);
return ch;
}
/***********
上面为usart.c,下面为usart.h
************/
#ifndef __USART_H_
#define __USART_H_
#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_usart.h"
#include "stdio.h"
typedef struct
{
u8 data[12];
} ptl_stack;
extern ptl_stack tx_stack;
typedef struct
{
u8 data[12];
} ptr_stack;
extern ptr_stack rx_stack;
void send_ptl(void);
void usart_config(void);
void usart_release_gpio_init(void);
void usart_para_config(void);
void usart_nvic_config(void);
void tx_stack_init(void);
void rx_stack_init(void);
#endif |