65687831

    1. 求推荐适合新人的STM32开发板 41/12439 stm32/stm8 2011-01-12
                                       欢迎来我的淘宝店来看看http://shop63120998.taobao.com/
    2. STM32入门系列教程~欢迎下载!! 136/28479 stm32/stm8 2010-09-11
                                       MARK
    3. stm8s207k6多从机SPI功能 41/16229 stm32/stm8 2010-08-17
                                       看到设置寄存器SPI_CR2的SSM和SSI来实现软件设置主从模式. 那NSS脚就做为普通IO用了. 所以一主多从时候,NSS脚根本做不了片选功能.
    4. Dsp中EDMA传输 4/4039 嵌入式系统 2010-05-27
      CSL_init(); /* DSP调用芯片支持库初始化*/ IRQ_nmiEnable(); /* enable NMI and GI */ IRQ_globalEnable(); IRQ_setVecs(vectors); /* point to the IRQ vector table */    IRQ_reset(IRQ_EVT_EDMAINT); //禁止、清除相应的中断 EDMA_clearPram(0x00000000); // 清除所有EDMA的配置RAM 区 hEdma12 = EDMA_open(EDMA_CHA_XEVT0, EDMA_OPEN_RESET); //开启发送通道Channel 12 ,得到句柄 hEdma13 = EDMA_open(EDMA_CHA_REVT0, EDMA_OPEN_RESET); //开启接收通道Channel 13 ,得到句柄 hMcbsp0 = MCBSP_open(MCBSP_DEV0, MCBSP_OPEN_RESET); //打开通道 channel 0     ConfigEDMA();     IRQ_enable(IRQ_EVT_EDMAINT); //使能EDMA中断 EDMA_intEnable(12); //EDMA通道使能.enable EDMA int (CIER)       EDMA_intEnable(13); EDMA_enableChannel(hEdma12); //使能发送通道,事件使能寄存器( EER) 的bit12 置1 EDMA_enableChannel(hEdma13); //使能发送通道,事件使能寄存器( EER) 的bit12 置1       ConfigMcBSP(); MCBSP_enableSrgr(hMcbsp0); //使能采样率发生器,置GRST = 1 for (waittime=0; waittime < 0xFF; waittime++); //应该是轮询检测XRDY和RRDY状态位,向发送寄存器写入待发送的数据,检查是否已经收到数据 MCBSP_enableXmt(hMcbsp0); //使能发送器 MCBSP_enableRcv(hMcbsp0); //使能接收器 MCBSP_enableFsync(hMcbsp0); //使能帧同步信号发生器,置FRST = 1         IRQ_disable(IRQ_EVT_EDMAINT);     EDMA_RSET(CIER, 0x0); MCBSP_close(hMcbsp0); /* close McBSP 0 */ EDMA_close(hEdma12); /* close EDMA 12 */ EDMA_close(hEdma13); /* close EDMA 13 */ } 这段程序是我找的,我把他们注释了,我想知道是在打开EDMA通道之前就发送数据到McBSP了吗? 在IRQ_disable(IRQ_EVT_EDMAINT)之前传输数据,必须是在一个死循环中等待中断吗?
    5.                                  楼上用的COSMIC or IARSTM8?
    6. STM32的SPI问题 7/5645 stm32/stm8 2010-05-04
                                       接电阻肯定会影响通讯呀,如果是上拉的,那就不能通讯了,不过你说你的波形是对的,就有点不好理解了
    7. HT1622的使用问题,望牛人告知! 2/5155 嵌入式系统 2010-03-24
      //定义HT1622的命令和数据 #define  RCosc      0x30  //内部RC振荡器(上电默认)1000 0011 0000 #define  LCD_on     0x06  //打开LCD 偏压发生器    1000 0000 0110 #define  LCD_off    0x04  //打开LCD 偏压发生器    1000 0000 0100 #define  Sys_en     0x02  //系统振荡器开          1000 0000 0010 #define  Sys_dis    0x00  //系统振荡器开          1000 0000 0000 #define  Tim_dis    0x00  //系统振荡器开          1000 0000 1000 #define  Wtd_dis    0x00  //系统振荡器开          1000 0000 1010 #define  Ton_off    0x00  //系统振荡器开          1000 0001 0000 #define  lcd_wr          5 #define  lcd_cs          4 #define  lcd_da          6 #define  LCDPORT        PORTA //定义简单的命令 #define SETLCDWR()  LCDPORT|=1
    8. [quote]引用 27 楼 lbing7 的回复: 解嵌入式系统的通信协议 这个东西除了工业标准的以外,其它一般的应用都是各家自己定义没有统一标准 感觉这个论题连对象是什么都没有搞清楚,这太泛了。。。 知之者,自知。
    9. wince下 sqlite 无法打开 19/5128 嵌入式系统 2010-03-23
      强制类型转换一下,看看会出什么提示…
    10. 小女子罗玉凤求助-_-! 9/3316 嵌入式系统 2010-02-10
      小女子?能否告诉下小弟! ???? 首先验明正身才好啊。哈哈哈哈
    11. 顶一下。
    12. WINCE下重新枚举USB设备的interface! 9/5459 嵌入式系统 2009-12-28
      在禁止USB期间复位USB相关端点寄存器,并设置新的描述符等。
    13. up
    14. 两块STM32F103C8开发板i2c通讯 10/7825 stm32/stm8 2009-12-16
                                       这里怎么就没人知道吗? 太冷清了吧? 版主呢?
    15. 怎么学到好的单片机编程思想 129/23427 嵌入式系统 2009-12-16
      自己慢慢从实践中得来,做得多了,自然就有想法了
    16.                                  一个好的编译器是应该从用户角度出发的。各位可以试试realview中的FOR语句设计,所有变量均要在函数的前面声明。总之没必要迷信这些国外公司,国内的编译器虽然落后,但也不是别人的就好的不得了。
    17. 操作CPIO口的0x56000000和0xB1600000和疑惑 14/6305 嵌入式系统 2009-12-09
      引用 13 楼 xilidecai 的回复: lpvrSrc不一定非要是物理地址,也可以是虚拟地址,这方面我也见过,不过具体什么情况下使用,我真记不住了,呵呵,回头我查找一下... 你再问下其他达人~~~
      好的,谢谢~! 我也再找找资料
    18. 给你个参考代码,你这应该是前面的初始化有问题 // 定义串口设置参数表格 const CString PorTbl[6] = {_T("COM1:"),_T("COM2:"),_T("COM3:"),_T("COM4:"),_T("COM5:"), _T("COM6:")}; const DWORD BaudTbl[6] = {4800, 9600, 19200, 38400, 57600,115200};        const DWORD DataBitTbl[2] = {7, 8}; const BYTE  StopBitTbl[3] = {ONESTOPBIT, ONE5STOPBITS, TWOSTOPBITS}; const BYTE  ParityTbl[4] = {NOPARITY, ODDPARITY, EVENPARITY, MARKPARITY}; BOOL CSerialPortDlg::OnInitDialog() {         CDialog::OnInitDialog();         // Set the icon for this dialog.  The framework does this automatically         //  when the application's main window is not a dialog         SetIcon(m_hIcon, TRUE);                        // Set big icon         SetIcon(m_hIcon, FALSE);                // Set small icon                 CenterWindow(GetDesktopWindow());        // center to the hpc screen         // TODO: Add extra initialization here         m_ComboBaud.SetCurSel(5);                        /* 默认波特率为: 115200 */         m_ComboData.SetCurSel(1);                        /* 默认数据位为: 8位 */         m_ComboParity.SetCurSel(0);                        /* 默认校验为: 无 */         m_ComboPort.SetCurSel(0);                        /* 默认端口为: COM1 */         m_ComboStop.SetCurSel(0);                        /* 默认停止位为: 1位 */         m_ButClose.EnableWindow(FALSE);                /* "关闭端口"按键无效 */         m_hComm = INVALID_HANDLE_VALUE;                /* 串口操作句柄无效 */         m_ExitThreadEvent = NULL;                        /* 串口接收线程退出事件无效 */         m_strRecDisp = _T("");                                /* 接收显示字符为空 */         UpdateData(FALSE);                                // 更新显示         return TRUE;  // return TRUE  unless you set the focus to a control } /******************************************************************************************* 函数名称: CSerialPortDlg::OnDestroy 描    述: 窗口销毁事件处理函数 输入参数: 无 输出参数: 无 返    回: 无 ********************************************************************************************/ void CSerialPortDlg::OnDestroy() {         CDialog::OnDestroy();                 // TODO: Add your message handler code here         } /******************************************************************************************* 函数名称: CALLBACK CSerialPortDlg::OnCommRecv 描    述: 串口接收数据成功回调函数 输入参数: 无 输出参数: 无 返    回: FALSE: 失败;    TRUE: 成功 ********************************************************************************************/ void CALLBACK CSerialPortDlg::OnCommRecv(CWnd* pWnd, char *buf, int buflen) {        CString tmp;         CSerialPortDlg * pDlg = (CSerialPortDlg*)pWnd;         CEdit *pRecvStrEdit = (CEdit*)pDlg->GetDlgItem(IDC_REC_DISP);                                                                                                                 /* 取得控件指针 */         for (int i = 0; i < buflen; i++, buf++)         {                 tmp.Format(_T("%c"), *buf);                                                /* 将字符转换为字符串 */                 pDlg->m_strRecDisp += tmp;         }         pRecvStrEdit->SetWindowText(pDlg->m_strRecDisp);        /* 显示在窗口上 */ } /******************************************************************************************* 函数名称: CSerialPortDlg::CommRecvTread 描    述: 串口接收线程 输入参数: LPVOID lparam: 线程参数,创建线程时传入 输出参数: 无 返    回: 0: 线程退出, 返回值没特殊含义 ********************************************************************************************/ DWORD CSerialPortDlg::CommRecvTread(LPVOID lparam) {         DWORD dwLength;         char *recvBuf = new char[1024];         CSerialPortDlg *pDlg = (CSerialPortDlg*)lparam;         while(TRUE)         {                                                                                                                                /* 等待线程退出事件 */                 if (WaitForSingleObject(pDlg->m_ExitThreadEvent, 0) == WAIT_OBJECT_0)                         break;                        if (pDlg->m_hComm != INVALID_HANDLE_VALUE)                 {                                                                                                                        /* 从串口读取数据 */                         BOOL fReadState = ReadFile(pDlg->m_hComm, recvBuf, 1024, &dwLength, NULL);                         if(!fReadState)                         {                                 //MessageBox(_T("无法从串口读取数据!"));                         }                         else                         {                                 if(dwLength != 0)                                         OnCommRecv(pDlg, recvBuf, dwLength);                        /* 接收成功调用回调函数 */                         }                 }         }                        delete[] recvBuf;         return 0; } /******************************************************************************************* 函数名称: CSerialPortDlg::OpenPort 描    述: 打开串口 输入参数: LPCTSTR Port: 串口名,如"COM0:","COM1:"                   int BaudRate: 波特率                   int DataBits: 数据位, 取值为7或8                   int StopBits: 停止位                   int Parity  : 奇偶校验位 输出参数: 无 返    回: FALSE: 失败;    TRUE: 成功 ********************************************************************************************/ BOOL CSerialPortDlg::OpenPort(LPCTSTR Port, int BaudRate, int DataBits, int StopBits, int Parity) {         COMMTIMEOUTS CommTimeOuts;         // 打开串口         m_hComm = CreateFile(Port, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);         if(m_hComm == INVALID_HANDLE_VALUE)         {                 MessageBox(_T("无法打开端口或端口已打开! 请检查是否已被占用, 例如GPRS占用UART0."));                 return FALSE;         }         GetCommState(m_hComm, &dcb);                                                /* 读取串口的DCB */         dcb.BaudRate = BaudRate;                                dcb.ByteSize = DataBits;         dcb.Parity = Parity;         dcb.StopBits = StopBits;                dcb.fParity = FALSE;                                                                /* 禁止奇偶校验 */         dcb.fBinary = TRUE;         dcb.fDtrControl = 0;                                                                /* 禁止流量控制 */         dcb.fRtsControl = 0;         dcb.fOutX = 0;         dcb.fInX = 0;         dcb.fTXContinueOnXoff = 0;                 //设置状态参数         SetCommMask(m_hComm, EV_RXCHAR);                                        /* 串口事件:接收到一个字符 */                SetupComm(m_hComm, 16384, 16384);                                        /* 设置接收与发送的缓冲区大小 */         if(!SetCommState(m_hComm, &dcb))                                        /* 设置串口的DCB */         {                 MessageBox(_T("无法按当前参数配置端口,请检查参数!"));                 ClosePort();                 return FALSE;         }                         //设置超时参数         GetCommTimeouts(m_hComm, &CommTimeOuts);                        CommTimeOuts.ReadIntervalTimeout = 100;                                /* 接收字符间最大时间间隔 */         CommTimeOuts.ReadTotalTimeoutMultiplier = 1;                        CommTimeOuts.ReadTotalTimeoutConstant = 100;                /* 读数据总超时常量 */         CommTimeOuts.WriteTotalTimeoutMultiplier = 0;         CommTimeOuts.WriteTotalTimeoutConstant = 0;                        if(!SetCommTimeouts(m_hComm, &CommTimeOuts))         {                 MessageBox(_T("无法设置超时参数!"));                 ClosePort();                 return FALSE;         }                         PurgeComm(m_hComm, PURGE_TXCLEAR | PURGE_RXCLEAR);         /* 清除收/发缓冲区 */                        return TRUE;                } /******************************************************************************************* 函数名称: CSerialPortDlg::OnOpenCom 描    述: "打开端口" 按键单击事件代码 输入参数: 无 输出参数: 无 返    回: 无 ********************************************************************************************/ void CSerialPortDlg::OnOpenCom() {         // TODO: Add your control notification handler code here         DWORD IDThread;         HANDLE hRecvThread;                                                                                                /* 接收线程句柄 */         UpdateData(TRUE);         CString strPort = PorTbl[m_ComboPort.GetCurSel()];                                /* 查表获取参数值 */         DWORD baud                = BaudTbl[m_ComboBaud.GetCurSel()];         DWORD databit   = DataBitTbl[m_ComboData.GetCurSel()];         BYTE stopbit    = StopBitTbl[m_ComboStop.GetCurSel()];         BYTE parity                = ParityTbl[m_ComboParity.GetCurSel()];         BOOL ret = OpenPort(strPort, baud, databit, stopbit, parity);        /* 打开串口 */         if (ret == FALSE)                 return;         m_ExitThreadEvent = CreateEvent(NULL, TRUE, FALSE, NULL);                /* 创建串口接收线程退出事件*/         // 创建串口接收线程         hRecvThread = CreateThread(0, 0, CommRecvTread, this, 0, &IDThread);         if (hRecvThread == NULL)         {                 MessageBox(_T("创建接收线程失败!"));                 return;         }                CloseHandle(hRecvThread);         m_ButOpen.EnableWindow(FALSE);                                                                        /* 打开端口按键禁止 */                                        m_ButClose.EnableWindow(TRUE);                                                                        /* 关闭端口按键使能 */                MessageBox(_T("打开") + strPort + _T("成功!")); } /******************************************************************************************* 函数名称: CSerialPortDlg::ClosePort 描    述: 关闭串口 输入参数: 无 输出参数: 无 返    回: FALSE: 失败;    TRUE: 成功 ********************************************************************************************/ BOOL CSerialPortDlg::ClosePort() {         if(m_hComm != INVALID_HANDLE_VALUE)         {                 SetCommMask(m_hComm, 0);                                PurgeComm(m_hComm, PURGE_TXCLEAR | PURGE_RXCLEAR);        /* 清除收/发缓冲 */                 CloseHandle(m_hComm);                                                                /* 关闭串口操作句柄 */                 m_hComm = INVALID_HANDLE_VALUE;                 return TRUE;         }         return FALSE; } /******************************************************************************************* 函数名称: CSerialPortDlg::OnOpenCom 描    述: "关闭端口" 按键单击事件代码 输入参数: 无 输出参数: 无 返    回: 无 ********************************************************************************************/ void CSerialPortDlg::OnCloseCom() {         // TODO: Add your control notification handler code here                 if (m_ExitThreadEvent != NULL)         {                 SetEvent(m_ExitThreadEvent);                                        /* 通知线程退出 */                 Sleep(1000);                 CloseHandle(m_ExitThreadEvent);                 m_ExitThreadEvent = NULL;         }         m_ButOpen.EnableWindow(TRUE);                                                /* 打开端口按键禁止 */                                        m_ButClose.EnableWindow(FALSE);                                                /* 关闭端口按键使能 */                ClosePort(); } /******************************************************************************************* 函数名称: CSerialPortDlg::OnSend 描    述: "发送" 按键单击事件代码 输入参数: 无 输出参数: 无 返    回: 无 ********************************************************************************************/ void CSerialPortDlg::OnSend() {         // TODO: Add your control notification handler code here                 DWORD dwactlen;         if (m_hComm == INVALID_HANDLE_VALUE)         {                 MessageBox(_T("串口未打开!"));                 return;         }         UpdateData(TRUE);         int len = m_strSendEdit.GetLength();                                 /* 取得输入字符串长度 */         char *psendbuf = new char[len];         for(int i = 0; i < len;i++)                 psendbuf = (char)m_strSendEdit.GetAt(i);                 /* 转换为单字节字符 */         WriteFile(m_hComm, psendbuf, len, &dwactlen, NULL);         /* 从串口发送数据 */                 delete[] psendbuf; } /******************************************************************************************* 函数名称: CSerialPortDlg::OnClearSend 描    述: "清除发送缓冲区" 按键单击事件代码 输入参数: 无 输出参数: 无 返    回: 无 ********************************************************************************************/ void CSerialPortDlg::OnClearSend() {         // TODO: Add your control notification handler code here         m_strSendEdit = _T("");                                                        /* 清除发送区的字符 */         UpdateData(FALSE); } /******************************************************************************************* 函数名称: CSerialPortDlg::OnClearRec 描    述: "清除接收缓冲区" 按键单击事件代码 输入参数: 无 输出参数: 无 返    回: 无 ********************************************************************************************/ void CSerialPortDlg::OnClearRec() {         // TODO: Add your control notification handler code here         m_strRecDisp = _T("");                                                SetDlgItemText(IDC_REC_DISP,m_strRecDisp);                /* 清除接收区的字符 */ }
    19. 谢谢,我还是不大明白,E现在已经是这样的了。 我在写命令和数据的时候是先E=1延时后再E=0,根据液晶给的时序,E的周期时间最小是1000纳秒,高低电平宽度最小值是450纳秒,这三个参数的最大值都不限。E的上升和下降时间最小值不限,最大值是45纳秒,这两个就不是我们能控制的了吧。 //LCD写命令函数 void LcdCommand(uchar LcdCom) { RS=0; RW=0; P1=LcdCom; E=1; _nop_();_nop_();_nop_(); E=0; _nop_();_nop_();_nop_(); } //--------------------------------------------- //LCD写数据函数 void LcdDataWrite(uchar LcdData) { RS=1; RW=0; P1=LcdData; E=1; _nop_();_nop_();_nop_(); E=0; _nop_();_nop_();_nop_(); } //--------------------------------------------------------
    20. 多重缓冲。 其次是缓冲里面不要做多余的操作。 有些需要储备的资源,先内存准备好。 这样就不会的了。 注意:只刷你需要变动的部分。

最近访客

< 1/1 >

统计信息

已有84人来访过

  • 芯积分:--
  • 好友:--
  • 主题:9
  • 回复:74

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言