資源簡介
都在一個main.c里,一次編譯就能通過,適合新手,按照注釋的引腳無腦接線就能看現象
代碼片段和文件信息
#include?“stm32f10x.h“
#include?
#define?USART1_REC_LEN?? 200?? //串口1定義最大接收字節數?200
#define?USART2_REC_LEN??????200???//串口2定義最大接收字節數?200
#define?EN_USART1_RX? 1 ??//使能(1)/禁止(0)串口1接收
#define?EN_USART2_RX??????1?????//使能(1)/禁止(0)串口2接收
static?u8??fac_us=0; //us延時倍乘數 ???
static?u16?fac_ms=0; //ms延時倍乘數在ucos下代表每個節拍的ms數
#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?
void?delay_init()
{
u32?reload;
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //選擇外部時鐘??HCLK/8
fac_us=SystemCoreClock/8000000; ??????//為系統時鐘的1/8??
reload=SystemCoreClock/8000000; ??????//每秒鐘的計數次數?單位為M??
??????????????????????//reload為24位寄存器最大值:16777216在72M下約合1.86s左右
SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk;??? //開啟SYSTICK中斷
SysTick->LOAD=reload;? ??????????//每1/delay_ostickspersec秒中斷一次
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;??? //開啟SYSTICK????
fac_ms=(u16)fac_us*1000; ??????????//代表每個ms需要的systick時鐘數???
}
void?delay_ms(u16?nms)
{ ? ?? ??
u32?temp; ???
SysTick->LOAD=(u32)nms*fac_ms; ??????//時間加載(SysTick->LOAD為24bit)
SysTick->VAL?=0x00; ???????????? //清空計數器
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk?; ??//開始倒數??
do
{
temp=SysTick->CTRL;?
}while((temp&0x01)&&!(temp&(1<<16))); ????//等待時間到達???
SysTick->CTRL&=?~SysTick_CTRL_ENABLE_Msk; ??//關閉計數器
SysTick->VAL?=0X00;??????? ???????? //清空計數器 ?? ????
}?
#if?EN_USART1_RX???//如果使能了接收
???????????????????//串口1中斷服務程序
???????????????????//注意讀取USARTx->SR能避免莫名其妙的錯誤???
u8?USART1_RX_BUF[USART1_REC_LEN];???????????????//接收緩沖最大USART_REC_LEN個字節.
???//接收狀態
?//bit15, 接收完成標志
?//bit14, 接收到0x0d
?//bit13~0, 接收到的有效字節數目
u16?USART1_RX_STA=0;???????????????????????????//接收狀態標記 ??
??
void?uart1_init(u32?bound){
??//GPIO端口設置
??GPIO_InitTypeDef?GPIO_InitStructure;
USART_InitTypeDef?USART_InitStructure;
NVIC_InitTypeDef?NVIC_InitStructure;
?
??//RCC_APB1PeriphClockCmd(?RCC_APB1Periph_USART2?|?RCC_APB1Periph_USART3??ENABLE);??
??RCC_APB2PeriphClockCmd(?RCC_APB2Periph_USART1?|?RCC_APB2Periph_GPIOA?/*|?RCC_APB2Periph_GPIOB??|?RCC_APB2Periph_GPIOC?*/|RCC_APB2Periph_AFIO??ENABLE);??
??
//USART1_TX???GPIOA.9初始化
??GPIO_InitStructure.GPIO_Pin?=?GPIO_Pin_9;?//PA.10
??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;//PA.10
??GPIO_InitStructure.GPIO_Mode?=?GPIO_Mode_IN_FLOATING;//浮空輸入
??GPIO_Init(GPIOA?&GPIO_InitStructure);//初始化GPIOA.10??
??//Usart1?NVIC?配
評論
共有 條評論