• 大小: 9KB
    文件类型: .c
    金币: 2
    下载: 1 次
    发布日期: 2021-05-29
  • 语言: 其他
  • 标签: 多串口  stm32  打印  

资源简介

都在一个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 配

评论

共有 条评论