首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

串口的基本知识(程序2)

串口的基本知识(程序2)

  • #include "stm32f10x.h"
  • #include "sys.h"
  • #include "exti.h"
  • #include "stdio.h"
  • //加入以下代码,支持printf函数,而不需要选择use MicroLIB
  • #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)
  • {
  •     void SendOneByte(u8 Byte);
  •         SendOneByte((uint8_t) ch);
  •         return ch;
  • }
  • #endif
  • void SendOneByte(u8 Byte)
  • {
  •         u8 i=8,tmp;
  •         TXD_low(); //发送起始位
  •         delay_us(104);
  •         //发送8位数据
  •         for(i=0;i<8;i++)
  •         {
  •                 tmp        = (Byte >> i) & 0x01;  //低位在前
  •                 if(tmp == 0)
  •                 {
  •                         TXD_low();
  •                         delay_us(104);        //0
  •                 }
  •                 else
  •                 {
  •                         TXD_high();
  •                         delay_us(104);        //1
  •                 }
  •         }
  • //        while(i--)
  • //        {
  • //          MNUSART_TXD = (Byte&0x01);     //先传低位
  • //          delay_us(104);
  • //          Byte = Byte>>1;
  • //          //无校验位
  • //          MNUSART_TXD=1;//发送结束位
  • //          delay_us(104);
  • //        }
  •          TXD_high();
  •          delay_us(104);
  • }
  • void SendBytes(u8 *str,u8 len)        //发送数组最好用这个,也可发送字符串
  • {
  •   u16 i;
  •   for(i=0;i<len;i++)
  •   {
  •            SendOneByte(str);
  •   }
  • }
  • void SendStr(u8 *str) //发送字符串,发送数组如果带0x00就中断发送了
  • {
  • while(*str)
  • SendOneByte(*str++);
  • }
  • int main(void)
  • {
  •   u8 len;
  •   u8 hello[]={0x5a,0xa5,0x00,0x00,0x01};
  •   delay_init();
  •   EXTIX_Init();
  •   //测试 发送一个字节
  •   SendOneByte(0x00);
  •   SendOneByte(0x01);
  •   SendOneByte(0x02);
  • //测试发送数组
  • SendBytes(hello,5);
  • //测试发送字符串
  • // SendBytes("hello word",11);
  • // SendStr("德玛西亚");
  •   while(1)
  •         {
  •       if(USART_RX_STA&0x8000)
  •           {
  •              printf("\r\n您发送的消息为:\r\n\r\n");
  •                    len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
  •                  SendBytes(USART_RX_BUF,len);
  •                  //也可以用下面的发送
  • //                 SendStr(USART_RX_BUF);
  • //                 for(len=0;len<200;len++)
  • //                 USART_RX_BUF[len]=0;
  •                    printf("\r\n\r\n");//插入换行
  •                 USART_RX_STA=0;
  •           }
  •         }
  • }

复制代码
  • #include "exti.h"
  • #include "stm32f10x_gpio.h"
  • #include "stm32f10x_exti.h"
  • #include "sys.h"
  • u8 tmp;
  • u8 USART_RX_BUF[USART_REC_LEN];
  • u16 USART_RX_STA=0;
  • //extern SendOneByte(u8 Byte);
  • void EXTIX_Init(void)
  • {
  •                 GPIO_InitTypeDef GPIO_InitStructure;
  •                 EXTI_InitTypeDef EXTI_InitStructure;
  •                 NVIC_InitTypeDef NVIC_InitStructure;
  •                 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);
  •                 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;                                 //PA.9 端口配置
  •                 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
  •                 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO口速度为50MHz
  •                 GPIO_Init(GPIOA, &GPIO_InitStructure);                                         //根据设定参数初始化GPIOB.5
  •                 GPIO_SetBits(GPIOA,GPIO_Pin_9);
  •                 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  •                 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;                          //浮空输入
  •                 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  •                 GPIO_Init(GPIOA, &GPIO_InitStructure);
  •                 GPIO_SetBits(GPIOA,GPIO_Pin_10);
  •                 //GPIOA.10 中断线以及中断初始化配置   下降沿触发
  •                 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource10);
  •                 EXTI_InitStructure.EXTI_Line=EXTI_Line10;
  •                 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  •                 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  •                 EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  •                 EXTI_Init(&EXTI_InitStructure);                 //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
  •                 NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
  •                 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =0;
  •                 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  •                 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  •                 NVIC_Init(&NVIC_InitStructure);
  • }
  • void EXTI15_10_IRQHandler(void)
  • {
  •    u8 i=9;
  •    if(EXTI_GetITStatus(EXTI_Line10) != RESET)
  •    {
  •                 /* Disable the Selected IRQ Channels -------------------------------------*/
  •                 NVIC->ICER[EXTI15_10_IRQn >> 0x05] =
  •                 (uint32_t)0x01 << (EXTI15_10_IRQn & (uint8_t)0x1F);
  •                 EXTI_ClearITPendingBit(EXTI_Line10);
  •                 delay_us(30);
  •                 while(i--)
  •                 {
  •                 tmp >>=1;
  •                 if(GPIOA->IDR&0x0400) tmp |=0x80;
  •                 delay_us(104);
  •         }
  •           if((USART_RX_STA&0x8000)==0)
  •           {
  •                         if(USART_RX_STA&0x4000)
  •                         {
  •                         if(tmp!=0x0a) USART_RX_STA=0;
  •                         else USART_RX_STA |=0x8000;
  •                         }
  •                         else
  •                         {
  •                         if(tmp==0x0d) USART_RX_STA|=0x4000;
  •                         else
  •                         {
  •                         USART_RX_BUF[USART_RX_STA&0X3FFF]=tmp ;
  •                         USART_RX_STA++;
  •                         if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收
  •                         }
  •                         }
  •           }
  •                 EXTI_ClearITPendingBit(EXTI_Line10);
  •                 NVIC->ISER[EXTI15_10_IRQn >> 0x05] =
  •                 (uint32_t)0x01 << (EXTI15_10_IRQn & (uint8_t)0x1F);
  •    }
  • }
好好学习,努力赚钱!
返回列表